In this notebook we conduct exploratory factor analyses (EFAs) on the datasets for our studies of concepts of mental life, in which each participants judged the various mental capacities of a particular target entity. We analyze datasets for adults and children from each of our five field sites: the US, Ghana, Thailand, China, and Vanuatu.

This notebook contains the results presented in the main text, in which we use Pearson correlations with our three-point response scale (no = 0, kinda = 0.5, yes = 1); see supplemental analyses for a version of these analyses treating kinda = yes = 1 and using tetrachoric correlations.

Adults

Samples

  country   n
       US 127
    Ghana 150
 Thailand 150
    China 136
  Vanuatu 148
    Total 711

Scale use

Factor retention: parallel analysis

Exploratory factor analysis

Factor loadings

the condition has length > 1 and only the first element will be usedthe condition has length > 1 and only the first element will be usedthe condition has length > 1 and only the first element will be usedthe condition has length > 1 and only the first element will be usedthe condition has length > 1 and only the first element will be used

Congruence

funs() is soft deprecated as of dplyr 0.8.0
Please use a list of either functions or lambdas: 

  # Simple named list: 
  list(mean = mean, median = median)

  # Auto named with `tibble::lst()`: 
  tibble::lst(mean, median)

  # Using lambdas
  list(~ mean(., trim = .2), ~ median(., na.rm = TRUE))
This warning is displayed once per session.

Bootstrapped congruence

Children

Samples

  country   n
       US 117
    Ghana 150
 Thailand 152
    China 131
  Vanuatu 143
    Total 693

Scale use

Factor retention: parallel analysis

Exploratory factor analysis

Factor loadings

the condition has length > 1 and only the first element will be usedthe condition has length > 1 and only the first element will be usedthe condition has length > 1 and only the first element will be usedthe condition has length > 1 and only the first element will be usedthe condition has length > 1 and only the first element will be used

Congruence

See All samples, below.

Bootstrapped congruence

All samples

Congruence

the condition has length > 1 and only the first element will be usedVectorized input to `element_text()` is not officially supported.
Results may be unexpected or may change in future versions of ggplot2.the condition has length > 1 and only the first element will be usedVectorized input to `element_text()` is not officially supported.
Results may be unexpected or may change in future versions of ggplot2.the condition has length > 1 and only the first element will be usedthe condition has length > 1 and only the first element will be used

Developmental comparisons

Column `country` joining character vector and factor, coercing into character vector

Column `country` joining character vector and factor, coercing into character vector

Column `country` joining character vector and factor, coercing into character vector

Column `country` joining character vector and factor, coercing into character vector

Column `country` joining character vector and factor, coercing into character vector

Joining, by = c("factor", "age_group", "country", "factor_name", "factor_descript", "factor_labdescript")
Joining, by = c("factor", "country", "age_group")
Column `country` joining character vector and factor, coercing into character vector

Saving 13 x 7.8 in image
LS0tCnRpdGxlOiAiQ29uY2VwdHMgb2YgbWVudGFsIGxpZmUgYWNyb3NzIGN1bHR1cmVzOiBTdXBwbGVtZW50YWwgYW5hbHlzaXMiCmF1dGhvcnM6ICJXZWlzbWFuLCBMZWdhcmUsICYgTHVocm1hbm4iCm91dHB1dDogCiAgaHRtbF9ub3RlYm9vazoKICAgIHRvYzogdHJ1ZQogICAgdG9jX2Zsb2F0OiB0cnVlCi0tLQoKYGBge3Igc2V0dXB9CmtuaXRyOjpvcHRzX2NodW5rJHNldChlY2hvID0gRiwgbWVzc2FnZSA9IEYpCmBgYAoKSW4gdGhpcyBub3RlYm9vayB3ZSBjb25kdWN0IGV4cGxvcmF0b3J5IGZhY3RvciBhbmFseXNlcyAoRUZBcykgb24gdGhlIGRhdGFzZXRzIGZvciBvdXIgc3R1ZGllcyBvZiBjb25jZXB0cyBvZiBtZW50YWwgbGlmZSwgaW4gd2hpY2ggZWFjaCBwYXJ0aWNpcGFudHMganVkZ2VkIHRoZSB2YXJpb3VzIG1lbnRhbCBjYXBhY2l0aWVzIG9mIGEgcGFydGljdWxhciB0YXJnZXQgZW50aXR5LiBXZSBhbmFseXplIGRhdGFzZXRzIGZvciBhZHVsdHMgYW5kIGNoaWxkcmVuIGZyb20gZWFjaCBvZiBvdXIgZml2ZSBmaWVsZCBzaXRlczogdGhlIFVTLCBHaGFuYSwgVGhhaWxhbmQsIENoaW5hLCBhbmQgVmFudWF0dS4gCgpUaGlzIG5vdGVib29rIGNvbnRhaW5zIHRoZSByZXN1bHRzIHByZXNlbnRlZCBpbiB0aGUgbWFpbiB0ZXh0LCBpbiB3aGljaCB3ZSB1c2UgUGVhcnNvbiBjb3JyZWxhdGlvbnMgd2l0aCBvdXIgdGhyZWUtcG9pbnQgcmVzcG9uc2Ugc2NhbGUgKG5vID0gMCwga2luZGEgPSAwLjUsIHllcyA9IDEpOyBzZWUgc3VwcGxlbWVudGFsIGFuYWx5c2VzIGZvciBhIHZlcnNpb24gb2YgdGhlc2UgYW5hbHlzZXMgdHJlYXRpbmcga2luZGEgPSB5ZXMgPSAxIGFuZCB1c2luZyB0ZXRyYWNob3JpYyBjb3JyZWxhdGlvbnMuCgoKYGBge3IsIGVjaG8gPSBGLCBtZXNzYWdlID0gRn0Kc291cmNlKCIuL3NjcmlwdHMvZGVwZW5kZW5jaWVzLlIiKQpzb3VyY2UoIi4vc2NyaXB0cy9jdXN0b21fZnVucy5SIikKc291cmNlKCIuL3NjcmlwdHMvdmFyX3JlY29kZV9jb250cmFzdC5SIikKYGBgCgpgYGB7ciBkYXRhfQojIHJlYWQgaW4gZGF0YSwgc2hvcnRlbiAiZmVlbCBzaWNrLCIgYW5kIGxpbWl0IHRvIHVuaXZlcnNhbCB0YXJnZXRzIGFuZCBxdWVzdGlvbnM6IGFkdWx0cwpkX3VzX2FkdWx0cyA8LSByZWFkX2NzdigiLi4vZGF0YS9kX3VzX2FkdWx0cy5jc3YiKSAlPiUKICBmaWx0ZXIodGFyZ2V0ICVpbiUgbGV2ZWxzX3RhcmdldF91bml2LCBxdWVzdGlvbl9jYXQgPT0gInVuaXZlcnNhbCIpICU+JQogIG11dGF0ZShxdWVzdGlvbiA9IGdzdWIoIlxcLCAuKiQiLCAiIFxcWy4uLlxcXSIsIHF1ZXN0aW9uKSkKZF9naF9hZHVsdHMgPC0gcmVhZF9jc3YoIi4uL2RhdGEvZF9naF9hZHVsdHMuY3N2IikgJT4lCiAgZmlsdGVyKHRhcmdldCAlaW4lIGxldmVsc190YXJnZXRfdW5pdiwgcXVlc3Rpb25fY2F0ID09ICJ1bml2ZXJzYWwiKSAlPiUKICBtdXRhdGUocXVlc3Rpb24gPSBnc3ViKCJcXCwgLiokIiwgIiBcXFsuLi5cXF0iLCBxdWVzdGlvbikpCmRfdGhfYWR1bHRzIDwtIHJlYWRfY3N2KCIuLi9kYXRhL2RfdGhfYWR1bHRzLmNzdiIpICU+JQogIGZpbHRlcih0YXJnZXQgJWluJSBsZXZlbHNfdGFyZ2V0X3VuaXYsIHF1ZXN0aW9uX2NhdCA9PSAidW5pdmVyc2FsIikgJT4lCiAgbXV0YXRlKHF1ZXN0aW9uID0gZ3N1YigiXFwsIC4qJCIsICIgXFxbLi4uXFxdIiwgcXVlc3Rpb24pKQpkX2NoX2FkdWx0cyA8LSByZWFkX2NzdigiLi4vZGF0YS9kX2NoX2FkdWx0cy5jc3YiKSAlPiUKICBmaWx0ZXIodGFyZ2V0ICVpbiUgbGV2ZWxzX3RhcmdldF91bml2LCBxdWVzdGlvbl9jYXQgPT0gInVuaXZlcnNhbCIpICU+JQogIG11dGF0ZShxdWVzdGlvbiA9IGdzdWIoIlxcLCAuKiQiLCAiIFxcWy4uLlxcXSIsIHF1ZXN0aW9uKSkKZF92dF9hZHVsdHMgPC0gcmVhZF9jc3YoIi4uL2RhdGEvZF92dF9hZHVsdHMuY3N2IikgJT4lCiAgZmlsdGVyKHRhcmdldCAlaW4lIGxldmVsc190YXJnZXRfdW5pdiwgcXVlc3Rpb25fY2F0ID09ICJ1bml2ZXJzYWwiKSAlPiUKICBtdXRhdGUocXVlc3Rpb24gPSBnc3ViKCJcXCwgLiokIiwgIiBcXFsuLi5cXF0iLCBxdWVzdGlvbikpCgojIHJlYWQgaW4gZGF0YSwgc2hvcnRlbiAiZmVlbCBzaWNrLCIgYW5kIGxpbWl0IHRvIHVuaXZlcnNhbCB0YXJnZXRzIGFuZCBxdWVzdGlvbnM6IGNoaWxkcmVuCmRfdXNfY2hpbGRyZW4gPC0gcmVhZF9jc3YoIi4uL2RhdGEvZF91c19jaGlsZHJlbi5jc3YiKSAlPiUKICBmaWx0ZXIodGFyZ2V0ICVpbiUgbGV2ZWxzX3RhcmdldF91bml2LCBxdWVzdGlvbl9jYXQgPT0gInVuaXZlcnNhbCIpICU+JQogIG11dGF0ZShxdWVzdGlvbiA9IGdzdWIoIlxcLCAuKiQiLCAiIFxcWy4uLlxcXSIsIHF1ZXN0aW9uKSkKZF9naF9jaGlsZHJlbiA8LSByZWFkX2NzdigiLi4vZGF0YS9kX2doX2NoaWxkcmVuLmNzdiIpICU+JQogIGZpbHRlcih0YXJnZXQgJWluJSBsZXZlbHNfdGFyZ2V0X3VuaXYsIHF1ZXN0aW9uX2NhdCA9PSAidW5pdmVyc2FsIikgJT4lCiAgbXV0YXRlKHF1ZXN0aW9uID0gZ3N1YigiXFwsIC4qJCIsICIgXFxbLi4uXFxdIiwgcXVlc3Rpb24pKQojIGRfZ2hfZW5nX2NoaWxkcmVuIDwtIHJlYWRfY3N2KCIuLi9kYXRhL2RfZ2hfZW5nX2NoaWxkcmVuLmNzdiIpICU+JQojICAgZmlsdGVyKHRhcmdldCAlaW4lIGxldmVsc190YXJnZXRfdW5pdiwgcXVlc3Rpb25fY2F0ID09ICJ1bml2ZXJzYWwiKSAlPiUKIyAgIG11dGF0ZShxdWVzdGlvbiA9IGdzdWIoIlxcLCAuKiQiLCAiIFxcWy4uLlxcXSIsIHF1ZXN0aW9uKSkKZF90aF9jaGlsZHJlbiA8LSByZWFkX2NzdigiLi4vZGF0YS9kX3RoX2NoaWxkcmVuLmNzdiIpICU+JQogIGZpbHRlcih0YXJnZXQgJWluJSBsZXZlbHNfdGFyZ2V0X3VuaXYsIHF1ZXN0aW9uX2NhdCA9PSAidW5pdmVyc2FsIikgJT4lCiAgbXV0YXRlKHF1ZXN0aW9uID0gZ3N1YigiXFwsIC4qJCIsICIgXFxbLi4uXFxdIiwgcXVlc3Rpb24pKQpkX2NoX2NoaWxkcmVuIDwtIHJlYWRfY3N2KCIuLi9kYXRhL2RfY2hfY2hpbGRyZW4uY3N2IikgJT4lCiAgZmlsdGVyKHRhcmdldCAlaW4lIGxldmVsc190YXJnZXRfdW5pdiwgcXVlc3Rpb25fY2F0ID09ICJ1bml2ZXJzYWwiKSAlPiUKICBtdXRhdGUocXVlc3Rpb24gPSBnc3ViKCJcXCwgLiokIiwgIiBcXFsuLi5cXF0iLCBxdWVzdGlvbikpCmRfdnRfY2hpbGRyZW4gPC0gcmVhZF9jc3YoIi4uL2RhdGEvZF92dF9jaGlsZHJlbi5jc3YiKSAlPiUKICBmaWx0ZXIodGFyZ2V0ICVpbiUgbGV2ZWxzX3RhcmdldF91bml2LCBxdWVzdGlvbl9jYXQgPT0gInVuaXZlcnNhbCIpICU+JQogIG11dGF0ZShxdWVzdGlvbiA9IGdzdWIoIlxcLCAuKiQiLCAiIFxcWy4uLlxcXSIsIHF1ZXN0aW9uKSkgJT4lCiAgIyBmaWx0ZXIgb3V0IHBhcnRpY2lwYW50cyBvdXRzaWRlIG9mIHRoZSBhZ2UgcmFuZ2UKICBmaWx0ZXIoKGFnZSA+PSA2ICYgYWdlIDw9IDEyKSB8IGlzLm5hKGFnZSkpCmBgYAoKYGBge3Igd2lkZX0KIyBtYWtlIHdpZGUtZm9ybSBkYXRhc2V0cyBmb3IgRUZBOiBhZHVsdHMKZF91c19hZHVsdHNfdyA8LSB3aWRlX2RmX2Z1bihkX3VzX2FkdWx0cykKZF9naF9hZHVsdHNfdyA8LSB3aWRlX2RmX2Z1bihkX2doX2FkdWx0cykKZF90aF9hZHVsdHNfdyA8LSB3aWRlX2RmX2Z1bihkX3RoX2FkdWx0cykKZF9jaF9hZHVsdHNfdyA8LSB3aWRlX2RmX2Z1bihkX2NoX2FkdWx0cykKZF92dF9hZHVsdHNfdyA8LSB3aWRlX2RmX2Z1bihkX3Z0X2FkdWx0cykKCiMgbWFrZSB3aWRlLWZvcm0gZGF0YXNldHMgZm9yIEVGQTogY2hpbGRyZW4KZF91c19jaGlsZHJlbl93IDwtIHdpZGVfZGZfZnVuKGRfdXNfY2hpbGRyZW4pCmRfZ2hfY2hpbGRyZW5fdyA8LSB3aWRlX2RmX2Z1bihkX2doX2NoaWxkcmVuKQojIGRfZ2hfZW5nX2NoaWxkcmVuX3cgPC0gd2lkZV9kZl9mdW4oZF9naF9lbmdfY2hpbGRyZW4pCmRfdGhfY2hpbGRyZW5fdyA8LSB3aWRlX2RmX2Z1bihkX3RoX2NoaWxkcmVuKQpkX2NoX2NoaWxkcmVuX3cgPC0gd2lkZV9kZl9mdW4oZF9jaF9jaGlsZHJlbikKZF92dF9jaGlsZHJlbl93IDwtIHdpZGVfZGZfZnVuKGRfdnRfY2hpbGRyZW4pCmBgYAoKCiMgQWR1bHRzCgojIyBTYW1wbGVzCgpgYGB7ciBzYW1wbGVzIGFkdWx0c30KYmluZF9yb3dzKGRfdXNfYWR1bHRzLCBkX2doX2FkdWx0cywgZF90aF9hZHVsdHMsIGRfY2hfYWR1bHRzLCBkX3Z0X2FkdWx0cykgJT4lCiAgbXV0YXRlKGNvdW50cnkgPSBmYWN0b3IoY291bnRyeSwgbGV2ZWxzID0gbGV2ZWxzX2NvdW50cnkpKSAlPiUKICBkaXN0aW5jdChjb3VudHJ5LCBzdWJqX2lkKSAlPiUKICBjb3VudChjb3VudHJ5KSAlPiUKICBqYW5pdG9yOjphZG9ybl90b3RhbHMoKQpgYGAKCiMjIFNjYWxlIHVzZQoKYGBge3Igc2NhbGUgdXNlIG1lYW4gb3ZlcmFsbCBhZHVsdHN9CmJpbmRfcm93cyhkX3VzX2FkdWx0cywgZF9naF9hZHVsdHMsIGRfdGhfYWR1bHRzLCBkX2NoX2FkdWx0cywgZF92dF9hZHVsdHMpICU+JQogIG11dGF0ZShjb3VudHJ5ID0gZmFjdG9yKGNvdW50cnksIGxldmVscyA9IGxldmVsc19jb3VudHJ5KSwKICAgICAgICAgcmVzcG9uc2VfY2F0ID0gcmVjb2RlX2ZhY3RvcihyZXNwb25zZV9jYXQsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIm5vIiA9ICJubyIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgImtpbmQgb2YiID0gImtpbmQgb2YiLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJ5ZXMiID0gInllcyIsIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC5taXNzaW5nID0gIm1pc3NpbmcgZGF0YSIpKSAlPiUKICBjb3VudChjb3VudHJ5LCByZXNwb25zZV9jYXQpICU+JQogIGNvbXBsZXRlKHJlc3BvbnNlX2NhdCwgbmVzdGluZyhjb3VudHJ5KSwgZmlsbCA9IGxpc3QobiA9IDApKSAlPiUKICBncm91cF9ieShjb3VudHJ5KSAlPiUKICBtdXRhdGUocHJvcCA9IG4vc3VtKG4sIG5hLnJtID0gVCkpICU+JQogIHVuZ3JvdXAoKSAlPiUKICBzZWxlY3QoLW4pICU+JQogIHNwcmVhZChyZXNwb25zZV9jYXQsIHByb3ApICU+JQogIGphbml0b3I6OmFkb3JuX3BjdF9mb3JtYXR0aW5nKGRpZ2l0cyA9IDIpCmBgYAoKIyMgRmFjdG9yIHJldGVudGlvbjogcGFyYWxsZWwgYW5hbHlzaXMKCmBgYHtyIHBhcmFsbGVsIGRpc3QgYWR1bHRzLCBmaWcud2lkdGggPSAzLCBmaWcuYXNwID0gMC41fQojIE5PVEU6IHRoZXJlIGFwcGVhcnMgdG8gYmUgc29tZSB1bnJlbGlhYmlsaXR5L25vbi1yZXByb2R1Y2liaWxpdHkgaW4gcmVzdWx0cywgZXNwZWNpYWxseSBmb3IgdnQgYWR1bHRzLCB3aGljaCBJIGRvbid0IHVuZGVyc3RhbmQgLS0gc28gaGVyZSdzIHRoZSBkaXN0cmlidXRpb24gb3ZlciBvdXRjb21lcyBvZiBwYXJhbGxlbCBhbmFseXNpcyB3aXRoIDEwMCBpdGVyYXRpb25zLiBXZSdsbCBjaG9vc2UgdGhlIG1lZGlhbiBudW1iZXIgb2YgZmFjdG9ycy4KCmlmIChmaWxlLmV4aXN0cygiLi4vcmVzdWx0cy9wYV9vdXRjb21lc19kaXN0X2FkdWx0cy5SRFMiKSkgewogIAogIHBhX291dGNvbWVzX2Rpc3RfYWR1bHRzIDwtIHJlYWRSRFMoIi4uL3Jlc3VsdHMvcGFfb3V0Y29tZXNfZGlzdF9hZHVsdHMuUkRTIikKICAKfSBlbHNlIHsKICAKICBwYV9vdXRjb21lc19kaXN0X2FkdWx0cyA8LSBkYXRhLmZyYW1lKHVzID0gTlVMTCwgZ2ggPSBOVUxMLCB0aCA9IE5VTEwsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjaCA9IE5VTEwsIHZ0ID0gTlVMTCkKICAKICBzZXQuc2VlZCg1NDMyMSkKICBuX2NvcmVzIDwtIHBhcmFsbGVsOjpkZXRlY3RDb3JlcygpCiAgb3B0aW9ucyhtYy5jb3JlcyA9IG5fY29yZXMpCiAgCiAgZm9yIChpIGluIDE6MTAwKSB7CiAgICBwYV9vdXRjb21lc19kaXN0X2FkdWx0c1tpLCAidXMiXSA8LSBmYS5wYXJhbGxlbChkX3VzX2FkdWx0c193LCBwbG90ID0gRikkbmZhY3QKICAgIHBhX291dGNvbWVzX2Rpc3RfYWR1bHRzW2ksICJnaCJdIDwtIGZhLnBhcmFsbGVsKGRfZ2hfYWR1bHRzX3csIHBsb3QgPSBGKSRuZmFjdCAgICAgCiAgICBwYV9vdXRjb21lc19kaXN0X2FkdWx0c1tpLCAidGgiXSA8LSBmYS5wYXJhbGxlbChkX3RoX2FkdWx0c193LCBwbG90ID0gRikkbmZhY3QKICAgIHBhX291dGNvbWVzX2Rpc3RfYWR1bHRzW2ksICJjaCJdIDwtIGZhLnBhcmFsbGVsKGRfY2hfYWR1bHRzX3csIHBsb3QgPSBGKSRuZmFjdAogICAgcGFfb3V0Y29tZXNfZGlzdF9hZHVsdHNbaSwgInZ0Il0gPC0gZmEucGFyYWxsZWwoZF92dF9hZHVsdHNfdywgcGxvdCA9IEYpJG5mYWN0CiAgfQogIAogIHNhdmVSRFMocGFfb3V0Y29tZXNfZGlzdF9hZHVsdHMsIGZpbGUgPSAiLi4vcmVzdWx0cy9wYV9vdXRjb21lc19kaXN0X2FkdWx0cy5SRFMiKQp9CgojIHBsb3QKcGFfb3V0Y29tZXNfZGlzdF9hZHVsdHMgJT4lCiAgcm93bmFtZXNfdG9fY29sdW1uKCJpdGVyIikgJT4lCiAgZ2F0aGVyKGNvdW50cnksIG5mYWN0LCAtaXRlcikgJT4lCiAgbXV0YXRlKGNvdW50cnkgPSBmYWN0b3IoY291bnRyeSwKICAgICAgICAgICAgICAgICAgICAgICAgICBsZXZlbHMgPSBjKCJ1cyIsICJnaCIsICJ0aCIsICJjaCIsICJ2dCIpLAogICAgICAgICAgICAgICAgICAgICAgICAgIGxhYmVscyA9IGxldmVsc19jb3VudHJ5KSkgJT4lCiAgZ2dwbG90KGFlcyh4ID0gbmZhY3QpKSArCiAgZmFjZXRfZ3JpZCh+IGNvdW50cnkpICsKICBnZW9tX2JhcihzdGF0ID0gImNvdW50IikgKwogIHNjYWxlX3hfY29udGludW91cyhsaW1pdHMgPSBjKDEsIG1heChwYV9vdXRjb21lc19kaXN0X2FkdWx0cykgKyAxKSwKICAgICAgICAgICAgICAgICAgICAgYnJlYWtzID0gc2VxKDAsIDEwMCwgMSkpICsKICBsYWJzKHggPSAiTnVtYmVyIG9mIGZhY3RvcnMgc3VnZ2VzdGVkIGJ5IGZhLnBhcmFsbGVsKCkiKQpgYGAKCiMjIEV4cGxvcmF0b3J5IGZhY3RvciBhbmFseXNpcwoKYGBge3IgZWZhIGFkdWx0c30Kc2V0LnNlZWQoNTQzMjEpCgojIGRvIGV4cGxvcmF0b3J5IGZhY3RvciBhbmFseXNpczogYWR1bHRzCmVmYV91c19hZHVsdHMgPC0gZmFfZnVuKGRfdXNfYWR1bHRzX3csIG4gPSBtZWRpYW4ocGFfb3V0Y29tZXNfZGlzdF9hZHVsdHMkdXMpKQpjb2xuYW1lcyhlZmFfdXNfYWR1bHRzJGxvYWRpbmdzKSA8LSBwYXN0ZTAoInVzQURVTFRTXyIsIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29sbmFtZXMoZWZhX3VzX2FkdWx0cyRsb2FkaW5ncykpCgplZmFfZ2hfYWR1bHRzIDwtIGZhX2Z1bihkX2doX2FkdWx0c193LCBuID0gbWVkaWFuKHBhX291dGNvbWVzX2Rpc3RfYWR1bHRzJGdoKSkKY29sbmFtZXMoZWZhX2doX2FkdWx0cyRsb2FkaW5ncykgPC0gcGFzdGUwKCJnaEFEVUxUU18iLCAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbG5hbWVzKGVmYV9naF9hZHVsdHMkbG9hZGluZ3MpKQoKZWZhX3RoX2FkdWx0cyA8LSBmYV9mdW4oZF90aF9hZHVsdHNfdywgbiA9IG1lZGlhbihwYV9vdXRjb21lc19kaXN0X2FkdWx0cyR0aCkpCmNvbG5hbWVzKGVmYV90aF9hZHVsdHMkbG9hZGluZ3MpIDwtIHBhc3RlMCgidGhBRFVMVFNfIiwgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb2xuYW1lcyhlZmFfdGhfYWR1bHRzJGxvYWRpbmdzKSkKCmVmYV9jaF9hZHVsdHMgPC0gZmFfZnVuKGRfY2hfYWR1bHRzX3csIG4gPSBtZWRpYW4ocGFfb3V0Y29tZXNfZGlzdF9hZHVsdHMkY2gpKQpjb2xuYW1lcyhlZmFfY2hfYWR1bHRzJGxvYWRpbmdzKSA8LSBwYXN0ZTAoImNoQURVTFRTXyIsIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29sbmFtZXMoZWZhX2NoX2FkdWx0cyRsb2FkaW5ncykpCgplZmFfdnRfYWR1bHRzIDwtIGZhX2Z1bihkX3Z0X2FkdWx0c193LCBuID0gbWVkaWFuKHBhX291dGNvbWVzX2Rpc3RfYWR1bHRzJHZ0KSkKY29sbmFtZXMoZWZhX3Z0X2FkdWx0cyRsb2FkaW5ncykgPC0gcGFzdGUwKCJ2dEFEVUxUU18iLCAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbG5hbWVzKGVmYV92dF9hZHVsdHMkbG9hZGluZ3MpKQpgYGAKCmBgYHtyIGZhY3RvciBuYW1lcyBhZHVsdHN9CmZhY3Rvcl9uYW1lc19hZHVsdHMgPC0gZGF0YS5mcmFtZShmYWN0b3IgPSBjKGNvbG5hbWVzKGVmYV91c19hZHVsdHMkbG9hZGluZ3MpLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb2xuYW1lcyhlZmFfZ2hfYWR1bHRzJGxvYWRpbmdzKSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29sbmFtZXMoZWZhX3RoX2FkdWx0cyRsb2FkaW5ncyksCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbG5hbWVzKGVmYV9jaF9hZHVsdHMkbG9hZGluZ3MpLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb2xuYW1lcyhlZmFfdnRfYWR1bHRzJGxvYWRpbmdzKSkpICU+JQogIG11dGF0ZShhZ2VfZ3JvdXAgPSAiYWR1bHRzIikgJT4lCiAgbXV0YXRlKGNvdW50cnkgPSBjYXNlX3doZW4oZ3JlcGwoIl51cyIsIGZhY3RvcikgfiAiVVMiLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgIGdyZXBsKCJeZ2giLCBmYWN0b3IpIH4gIkdoYW5hIiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICBncmVwbCgiXnRoIiwgZmFjdG9yKSB+ICJUaGFpbGFuZCIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZ3JlcGwoIl5jaCIsIGZhY3RvcikgfiAiQ2hpbmEiLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgIGdyZXBsKCJednQiLCBmYWN0b3IpIH4gIlZhbnVhdHUiKSwKICAgICAgICAgY291bnRyeSA9IGZhY3Rvcihjb3VudHJ5LCBsZXZlbHNfY291bnRyeSkpICU+JQogIG11dGF0ZShmYWN0b3JfbmFtZSA9IGdzdWIoIl51cyIsICJVUyAiLCBmYWN0b3IpLAogICAgICAgICBmYWN0b3JfbmFtZSA9IGdzdWIoIl5naCIsICJHaC4gIiwgZmFjdG9yX25hbWUpLAogICAgICAgICBmYWN0b3JfbmFtZSA9IGdzdWIoIl50aCIsICJUaC4gIiwgZmFjdG9yX25hbWUpLAogICAgICAgICBmYWN0b3JfbmFtZSA9IGdzdWIoIl5jaCIsICJDaC4gIiwgZmFjdG9yX25hbWUpLAogICAgICAgICBmYWN0b3JfbmFtZSA9IGdzdWIoIl52dCIsICJWYS4gIiwgZmFjdG9yX25hbWUpLAogICAgICAgICBmYWN0b3JfbmFtZSA9IGdzdWIoIkFEVUxUUyIsICJhZHVsdHMiLCBmYWN0b3JfbmFtZSksCiAgICAgICAgIGZhY3Rvcl9uYW1lID0gZ3N1YigiX0YiLCAiIEZhY3RvciAiLCBmYWN0b3JfbmFtZSkpICU+JQogIG11dGF0ZShmYWN0b3JfZGVzY3JpcHQgPSByZWNvZGUoZmFjdG9yLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdXNBRFVMVFNfRjEgPSAiQm9keSIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1c0FEVUxUU19GMiA9ICJIZWFydCIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1c0FEVUxUU19GMyA9ICJNaW5kIiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGdoQURVTFRTX0YxID0gIklubmVyIHNwaGVyZSAobWluZC1saWtlKSIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBnaEFEVUxUU19GMiA9ICJCb2R5LWxpa2UiLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZ2hBRFVMVFNfRjMgPSAiSW50ZXJwZXJzb25hbCwgcmVsaWdpb3VzIiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoQURVTFRTX0YxID0gIkJvZHktbGlrZSIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aEFEVUxUU19GMiA9ICJIZWFydC1saWtlIiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoQURVTFRTX0YzID0gIk1pbmQtbGlrZSIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjaEFEVUxUU19GMSA9ICJCb2R5LWxpa2UiLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2hBRFVMVFNfRjIgPSAiSGVhcnQtbGlrZSIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjaEFEVUxUU19GMyA9ICJNaW5kLWxpa2UiLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdnRBRFVMVFNfRjEgPSAiSGFybW9ueSAobWluZC1saWtlLCBoZWFydC1saWtlKSIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2dEFEVUxUU19GMiA9ICJTaW4gKGJvZHktbGlrZSkiKSwKICAgICAgICAgZmFjdG9yX2xhYmRlc2NyaXB0ID0gcGFzdGUoZ3N1YigiLipfRiIsICJGIiwgZmFjdG9yKSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmFjdG9yX2Rlc2NyaXB0LCBzZXAgPSAiOiAiKSkKYGBgCgojIyBGYWN0b3IgbG9hZGluZ3MKCmBgYHtyIG9yZGVyIGFkdWx0c30KIyBvcmRlciBjYXBhY2l0aWVzOiBhZHVsdHMKb3JkZXJfdXNfYWR1bHRzIDwtIGZhLnNvcnQoZWZhX3VzX2FkdWx0cykkbG9hZGluZ3NbXSAlPiUgcm93bmFtZXMoKQpvcmRlcl9naF9hZHVsdHMgPC0gZmEuc29ydChlZmFfZ2hfYWR1bHRzKSRsb2FkaW5nc1tdICU+JSByb3duYW1lcygpCm9yZGVyX3RoX2FkdWx0cyA8LSBmYS5zb3J0KGVmYV90aF9hZHVsdHMpJGxvYWRpbmdzW10gJT4lIHJvd25hbWVzKCkKb3JkZXJfY2hfYWR1bHRzIDwtIGZhLnNvcnQoZWZhX2NoX2FkdWx0cykkbG9hZGluZ3NbXSAlPiUgcm93bmFtZXMoKQpvcmRlcl92dF9hZHVsdHMgPC0gZmEuc29ydChlZmFfdnRfYWR1bHRzKSRsb2FkaW5nc1tdICU+JSByb3duYW1lcygpCmBgYAoKYGBge3IgbG9hZGluZ3MgYWR1bHRzfQojIGNvbXBpbGUgbG9hZGluZ3M6IGFkdWx0cwpsb2FkaW5nc19hZHVsdHMgPC0gYmluZF9yb3dzKAogIGxvYWRpbmdzX2Z1bihlZmFfdXNfYWR1bHRzKSAlPiUgbXV0YXRlKGNvdW50cnkgPSAiVVMiKSwKICBsb2FkaW5nc19mdW4oZWZhX2doX2FkdWx0cykgJT4lIG11dGF0ZShjb3VudHJ5ID0gIkdoYW5hIiksCiAgbG9hZGluZ3NfZnVuKGVmYV90aF9hZHVsdHMpICU+JSBtdXRhdGUoY291bnRyeSA9ICJUaGFpbGFuZCIpLAogIGxvYWRpbmdzX2Z1bihlZmFfY2hfYWR1bHRzKSAlPiUgbXV0YXRlKGNvdW50cnkgPSAiQ2hpbmEiKSwKICBsb2FkaW5nc19mdW4oZWZhX3Z0X2FkdWx0cykgJT4lIG11dGF0ZShjb3VudHJ5ID0gIlZhbnVhdHUiKSkgJT4lCiAgbXV0YXRlKGNvdW50cnkgPSBmYWN0b3IoY291bnRyeSwgbGV2ZWxzID0gbGV2ZWxzX2NvdW50cnkpLAogICAgICAgICBjYXBhY2l0eV9vcmRfdXMgPSBmYWN0b3IoY2FwYWNpdHksIGxldmVscyA9IG9yZGVyX3VzX2FkdWx0cyksCiAgICAgICAgIGNhcGFjaXR5X29yZF9naCA9IGZhY3RvcihjYXBhY2l0eSwgbGV2ZWxzID0gb3JkZXJfZ2hfYWR1bHRzKSwKICAgICAgICAgY2FwYWNpdHlfb3JkX3RoID0gZmFjdG9yKGNhcGFjaXR5LCBsZXZlbHMgPSBvcmRlcl90aF9hZHVsdHMpLAogICAgICAgICBjYXBhY2l0eV9vcmRfY2ggPSBmYWN0b3IoY2FwYWNpdHksIGxldmVscyA9IG9yZGVyX2NoX2FkdWx0cyksCiAgICAgICAgIGNhcGFjaXR5X29yZF92dCA9IGZhY3RvcihjYXBhY2l0eSwgbGV2ZWxzID0gb3JkZXJfdnRfYWR1bHRzKSkgJT4lCiAgYXJyYW5nZShjb3VudHJ5LCBmYWN0b3IsIGRlc2MoYWJzKGxvYWRpbmcpKSwgY2FwYWNpdHkpICU+JQogIG11dGF0ZShvcmRlciA9IDE6bnJvdyguKSkgJT4lCiAgbGVmdF9qb2luKGZhY3Rvcl9uYW1lc19hZHVsdHMpCmBgYAoKYGBge3IgaGVhdG1hcHMgYnkgc2l0ZSBhZHVsdHMsIGZpZy53aWR0aCA9IDE1LCBmaWcuYXNwID0gMC4yNX0KcGxvdF9ncmlkKGhlYXRtYXBfZnVuKGVmYV91c19hZHVsdHMsIAogICAgICAgICAgICAgICAgICAgICAgZmFjdG9yX25hbWVzID0gZmFjdG9yX25hbWVzX2FkdWx0cyAlPiUKICAgICAgICAgICAgICAgICAgICAgICAgZmlsdGVyKGNvdW50cnkgPT0gIlVTIikgJT4lCiAgICAgICAgICAgICAgICAgICAgICAgIHNlbGVjdChmYWN0b3JfbGFiZGVzY3JpcHQpICU+JQogICAgICAgICAgICAgICAgICAgICAgICB1bmxpc3QoKSkgKyAKICAgICAgICAgICAgdGhlbWUobGVnZW5kLnBvc2l0aW9uID0gIm5vbmUiKSArCiAgICAgICAgICAgIGxhYnModGl0bGUgPSAiVVM6IGFkdWx0cyIpLAogICAgICAgICAgaGVhdG1hcF9mdW4oZWZhX2doX2FkdWx0cywKICAgICAgICAgICAgICAgICAgICAgIGZhY3Rvcl9uYW1lcyA9IGZhY3Rvcl9uYW1lc19hZHVsdHMgJT4lCiAgICAgICAgICAgICAgICAgICAgICAgIGZpbHRlcihjb3VudHJ5ID09ICJHaGFuYSIpICU+JQogICAgICAgICAgICAgICAgICAgICAgICBzZWxlY3QoZmFjdG9yX2xhYmRlc2NyaXB0KSAlPiUKICAgICAgICAgICAgICAgICAgICAgICAgdW5saXN0KCkpICsgCiAgICAgICAgICAgIHRoZW1lKGxlZ2VuZC5wb3NpdGlvbiA9ICJub25lIikgKwogICAgICAgICAgICBsYWJzKHRpdGxlID0gIkdIQU5BOiBhZHVsdHMiKSwKICAgICAgICAgIGhlYXRtYXBfZnVuKGVmYV90aF9hZHVsdHMsCiAgICAgICAgICAgICAgICAgICAgICBmYWN0b3JfbmFtZXMgPSBmYWN0b3JfbmFtZXNfYWR1bHRzICU+JQogICAgICAgICAgICAgICAgICAgICAgICBmaWx0ZXIoY291bnRyeSA9PSAiVGhhaWxhbmQiKSAlPiUKICAgICAgICAgICAgICAgICAgICAgICAgc2VsZWN0KGZhY3Rvcl9sYWJkZXNjcmlwdCkgJT4lCiAgICAgICAgICAgICAgICAgICAgICAgIHVubGlzdCgpKSArIAogICAgICAgICAgICB0aGVtZShsZWdlbmQucG9zaXRpb24gPSAibm9uZSIpICsKICAgICAgICAgICAgbGFicyh0aXRsZSA9ICJUSEFJTEFORDogYWR1bHRzIiksCiAgICAgICAgICBoZWF0bWFwX2Z1bihlZmFfY2hfYWR1bHRzLAogICAgICAgICAgICAgICAgICAgICAgZmFjdG9yX25hbWVzID0gZmFjdG9yX25hbWVzX2FkdWx0cyAlPiUKICAgICAgICAgICAgICAgICAgICAgICAgZmlsdGVyKGNvdW50cnkgPT0gIkNoaW5hIikgJT4lCiAgICAgICAgICAgICAgICAgICAgICAgIHNlbGVjdChmYWN0b3JfbGFiZGVzY3JpcHQpICU+JQogICAgICAgICAgICAgICAgICAgICAgICB1bmxpc3QoKSkgKyAKICAgICAgICAgICAgdGhlbWUobGVnZW5kLnBvc2l0aW9uID0gIm5vbmUiKSArCiAgICAgICAgICAgIGxhYnModGl0bGUgPSAiQ0hJTkE6IGFkdWx0cyIpLAogICAgICAgICAgaGVhdG1hcF9mdW4oZWZhX3Z0X2FkdWx0cywKICAgICAgICAgICAgICAgICAgICAgIGZhY3Rvcl9uYW1lcyA9IGZhY3Rvcl9uYW1lc19hZHVsdHMgJT4lCiAgICAgICAgICAgICAgICAgICAgICAgIGZpbHRlcihjb3VudHJ5ID09ICJWYW51YXR1IikgJT4lCiAgICAgICAgICAgICAgICAgICAgICAgIHNlbGVjdChmYWN0b3JfbGFiZGVzY3JpcHQpICU+JQogICAgICAgICAgICAgICAgICAgICAgICB1bmxpc3QoKSkgKyAKICAgICAgICAgICAgdGhlbWUobGVnZW5kLnBvc2l0aW9uID0gIm5vbmUiKSArCiAgICAgICAgICAgIGxhYnModGl0bGUgPSAiVkFOVUFUVTogYWR1bHRzIiksCiAgICAgICAgICBuY29sID0gNSkKYGBgCgpgYGB7ciBoZWF0bWFwIGFkdWx0cywgZmlnLndpZHRoID0gNSwgZmlnLmFzcCA9IDAuN30KIyBtYWtlIGhlYXRtYXAgZmlndXJlOiBhZHVsdHMKbG9hZGluZ3NfYWR1bHRzICU+JQogIG11dGF0ZShmYWN0b3JfbnVtID0gYXMubnVtZXJpYyhnc3ViKCIuKkYiLCAiIiwgZmFjdG9yKSkpICU+JQogIG11dGF0ZShzYW1wbGUgPSBwYXN0ZShjb3VudHJ5LCAiYWR1bHRzIiwgc2VwID0gIlxuIikpICU+JQogIGxlZnRfam9pbihmYWN0b3JfbmFtZXNfYWR1bHRzKSAlPiUKICBtdXRhdGUoY291bnRyeSA9IGZhY3Rvcihjb3VudHJ5LCBsZXZlbHMgPSBsZXZlbHNfY291bnRyeSkpICU+JQogIGdncGxvdChhZXMoeCA9IHJlb3JkZXIoZmFjdG9yX2xhYmRlc2NyaXB0LCBmYWN0b3JfbnVtKSwgCiAgICAgICAgICAgICB5ID0gcmVvcmRlcihjYXBhY2l0eSwgZGVzYyhjYXBhY2l0eV9vcmRfdXMpKSwKICAgICAgICAgICAgICMgeSA9IHJlb3JkZXIoY2FwYWNpdHksIGRlc2MoY2FwYWNpdHlfb3JkX2VjKSksIAogICAgICAgICAgICAgIyB5ID0gcmVvcmRlcihjYXBhY2l0eSwgZGVzYyhjYXBhY2l0eV9vcmRfZ2gpKSwKICAgICAgICAgICAgICMgeSA9IHJlb3JkZXIoY2FwYWNpdHksIGRlc2MoY2FwYWNpdHlfb3JkX3RoKSksCiAgICAgICAgICAgICAjIHkgPSByZW9yZGVyKGNhcGFjaXR5LCBkZXNjKGNhcGFjaXR5X29yZF9jaCkpLAogICAgICAgICAgICAgIyB5ID0gcmVvcmRlcihjYXBhY2l0eSwgZGVzYyhjYXBhY2l0eV9vcmRfdnQpKSwKICAgICAgICAgICAgIGZpbGwgPSBsb2FkaW5nKSkgKwogIGZhY2V0X2dyaWQofiByZW9yZGVyKHNhbXBsZSwgYXMubnVtZXJpYyhjb3VudHJ5KSksIHNjYWxlcyA9ICJmcmVlIiwgc3BhY2UgPSAiZnJlZSIpICsKICBnZW9tX3RpbGUoY29sb3IgPSAiYmxhY2siLCBzaXplID0gMC4yKSArCiAgZ2VvbV90ZXh0KGFlcyhsYWJlbCA9IGZvcm1hdChyb3VuZChsb2FkaW5nLCAyKSwgbnNtYWxsID0gMikpLCBzaXplID0gMykgKwogIHNjYWxlX2ZpbGxfZGlzdGlsbGVyKHBhbGV0dGUgPSAiUmRZbEJ1IiwgbGltaXRzID0gYygtMSwgMSksCiAgICAgICAgICAgICAgICAgICAgICAgZ3VpZGUgPSBndWlkZV9jb2xvcmJhcihiYXJoZWlnaHQgPSAyMCwgYmFyd2lkdGggPSAwLjUpKSArCiAgdGhlbWVfbWluaW1hbCgpICsKICB0aGVtZShheGlzLnRleHQueCA9IGVsZW1lbnRfdGV4dChhbmdsZSA9IDQ1LCBoanVzdCA9IDEsIHZqdXN0ID0gMSksCiAgICAgICAgcGFuZWwuc3BhY2luZy54ID0gdW5pdCgwLjgsICJsaW5lcyIpLAogICAgICAgIHN0cmlwLnRleHQueCA9IGVsZW1lbnRfdGV4dChzaXplID0gMTAsIGZhY2UgPSAiYm9sZCIpKSArCiAgbGFicyh4ID0gTlVMTCwgeSA9ICJDYXBhY2l0eSIsIGZpbGwgPSAiRmFjdG9yXG5sb2FkaW5nIikKYGBgCgojIyBDb25ncnVlbmNlCgpgYGB7ciBjb25ncnVlbmNlIGFkdWx0c30KY29uZ19hZHVsdHMgPC0gZmEuY29uZ3J1ZW5jZSh4ID0gbGlzdChlZmFfdXNfYWR1bHRzJGxvYWRpbmdzLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVmYV9naF9hZHVsdHMkbG9hZGluZ3MsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZWZhX3RoX2FkdWx0cyRsb2FkaW5ncywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlZmFfY2hfYWR1bHRzJGxvYWRpbmdzLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVmYV92dF9hZHVsdHMkbG9hZGluZ3MpLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRpZ2l0cyA9IDUpICU+JQogICMgZ2V0X3VwcGVyX3RyaV9mdW4oKSAlPiUKICBkYXRhLmZyYW1lKCkgJT4lCiAgcm93bmFtZXNfdG9fY29sdW1uKCJmYWN0b3JfQSIpICU+JQogIGdhdGhlcihmYWN0b3JfQiwgY29uZywgLWZhY3Rvcl9BKSAlPiUKICBsZWZ0X2pvaW4oZmFjdG9yX25hbWVzX2FkdWx0cyAlPiUgCiAgICAgICAgICAgICAgcmVuYW1lX2FsbChsaXN0KH4gKHBhc3RlKC4sICJBIiwgc2VwID0gIl8iKSkpKSkgJT4lCiAgbGVmdF9qb2luKGZhY3Rvcl9uYW1lc19hZHVsdHMgJT4lIAogICAgICAgICAgICAgIHJlbmFtZV9hbGwobGlzdCh+IChwYXN0ZSguLCAiQiIsIHNlcCA9ICJfIikpKSkpCmBgYAoKYGBge3IgdG9wIG1hdGNoIGFkdWx0c30KY29uZ19hZHVsdHNfdG9wX21hdGNoX0EgPC0gdG9wX21hdGNoX2Z1bihjb25nX2FkdWx0cywgImNvdW50cnlfQSIpCmNvbmdfYWR1bHRzX3RvcF9tYXRjaF9CIDwtIHRvcF9tYXRjaF9mdW4oY29uZ19hZHVsdHMsICJjb3VudHJ5X0IiKQpgYGAKCmBgYHtyIGNvbmcgYWxsIHBhaXJzIGFkdWx0cywgZmlnLndpZHRoID0gNSwgZmlnLmFzcCA9IDAuN30KY29uZ19hZHVsdHMgJT4lCiAgbXV0YXRlX2F0KCN2YXJzKGNvbnRhaW5zKCJsYWJkZXNjcmlwdCIpKSwKICAgIHZhcnMoZmFjdG9yX2xhYmRlc2NyaXB0X0EpLAogICAgZnVucyhnc3ViKCIgXFwoIiwgIlxuXFwoIiwgLikpKSAlPiUKICBtdXRhdGVfYXQoI3ZhcnMoY29udGFpbnMoImxhYmRlc2NyaXB0IikpLAogICAgdmFycyhmYWN0b3JfbGFiZGVzY3JpcHRfQSksCiAgICBmdW5zKGdzdWIoIlxcLyIsICJcXC9cbiIsIC4pKSkgJT4lCiAgIyBsZWZ0X2pvaW4oY29uZ19hZHVsdHNfdG9wX21hdGNoX0EgJT4lIHJlbmFtZSh0b3BfbWF0Y2hfQSA9IHRvcF9tYXRjaCkpICU+JQogIGxlZnRfam9pbihjb25nX2FkdWx0c190b3BfbWF0Y2hfQiAlPiUgcmVuYW1lKHRvcF9tYXRjaF9CID0gdG9wX21hdGNoKSkgJT4lCiAgbXV0YXRlKGlzX3RvcF9tYXRjaCA9IGNhc2Vfd2hlbihmYWN0b3JfQSA9PSBmYWN0b3JfQiB+ICJib2xkLml0YWxpYyIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAjIGZhY3Rvcl9BID09IHRvcF9tYXRjaF9BIH4gImJvbGQiLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmFjdG9yX0IgPT0gdG9wX21hdGNoX0IgfiAiYm9sZCIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBUUlVFIH4gInBsYWluIikpICU+JQogICMgbXV0YXRlKGNvbmcgPSBpZmVsc2UoY29uZyA9PSAxLCBOQV9yZWFsXywgY29uZykpICU+JQogIG11dGF0ZShzYW1wbGVfQSA9IHBhc3RlKHRvdXBwZXIoY291bnRyeV9BKSwgImFkdWx0cyIsIHNlcCA9ICI6XG4iKSkgJT4lCiAgbXV0YXRlKHNhbXBsZV9CID0gcGFzdGUodG91cHBlcihjb3VudHJ5X0IpLCAiYWR1bHRzIiwgc2VwID0gIjpcbiIpKSAlPiUKICBtdXRhdGVfYXQodmFycyhjb3VudHJ5X0EsIGNvdW50cnlfQiksCiAgICAgICAgICAgIGZ1bnMoZmFjdG9yKHRvdXBwZXIoLiksIGxldmVscyA9IHRvdXBwZXIobGV2ZWxzX2NvdW50cnkpKSkpICU+JQogIGdncGxvdChhZXMoeCA9IGZhY3Rvcl9sYWJkZXNjcmlwdF9BLAogICAgICAgICAgICAgeSA9IHJlb3JkZXIoZmFjdG9yX2xhYmRlc2NyaXB0X0IsIGRlc2MoZmFjdG9yX2xhYmRlc2NyaXB0X0IpKSwKICAgICAgICAgICAgIGZpbGwgPSBjb25nKSkgKwogIGZhY2V0X2dyaWQocmVvcmRlcihzYW1wbGVfQiwgYXMubnVtZXJpYyhjb3VudHJ5X0IpKSB+IAogICAgICAgICAgICAgICByZW9yZGVyKHNhbXBsZV9BLCBhcy5udW1lcmljKGNvdW50cnlfQSkpLCAKICAgICAgICAgICAgIHNjYWxlcyA9ICJmcmVlIiwgc3BhY2UgPSAiZnJlZSIpICsKICBnZW9tX3RpbGUoY29sb3IgPSAiYmxhY2siLCBzaXplID0gMC4yKSArCiAgZ2VvbV90ZXh0KGFlcyhsYWJlbCA9IGNhc2Vfd2hlbihpcy5uYShjb25nKSB+ICIiLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVFJVRSB+IGZvcm1hdChyb3VuZChjb25nLCAyKSwgbnNtYWxsID0gMikpLAogICAgICAgICAgICAgICAgZm9udGZhY2UgPSBpc190b3BfbWF0Y2gsCiAgICAgICAgICAgICAgICBjb2xvciA9IGlzX3RvcF9tYXRjaCksCiAgICAgICAgICAgIHNpemUgPSAzLCBzaG93LmxlZ2VuZCA9IEYpICsKICBzY2FsZV9jb2xvcl9tYW51YWwodmFsdWVzID0gYygiZGFya3JlZCIsICJkYXJrYmx1ZSIsICJibGFjayIpKSArCiAgc2NhbGVfZmlsbF92aXJpZGlzX2Mob3B0aW9uID0gInZpcmlkaXMiLCAKICAgICAgICAgICAgICAgICAgICAgICBndWlkZSA9IGd1aWRlX2NvbG9yYmFyKGJhcndpZHRoID0gMjUsIGJhcmhlaWdodCA9IDAuNSkpICsKICB0aGVtZV9taW5pbWFsKCkgKwogIHRoZW1lKGF4aXMudGV4dC54ID0gZWxlbWVudF90ZXh0KGFuZ2xlID0gNDUsIGhqdXN0ID0gMSwgdmp1c3QgPSAxKSwKICAgICAgICBsZWdlbmQucG9zaXRpb24gPSAiYm90dG9tIiwKICAgICAgICBzdHJpcC50ZXh0ID0gZWxlbWVudF90ZXh0KHNpemUgPSAxMCwgZmFjZSA9ICJib2xkIikpICsKICBsYWJzKHggPSBOVUxMLCB5ID0gTlVMTCwgZmlsbCA9IGV4cHJlc3Npb24oaXRhbGljKHJbY10pKSkKYGBgCgojIyBCb290c3RyYXBwZWQgY29uZ3J1ZW5jZQoKYGBge3IgYm9vdHN0cmFwIGNvbmdydWVuY2UgYWR1bHRzfQppZiAoZmlsZS5leGlzdHMoIi4uL3Jlc3VsdHMvY29uZ19kZl9hZHVsdHMuUkRTIikpIHsKICAKICBjb25nX2RmX2FkdWx0cyA8LSByZWFkUkRTKCIuLi9yZXN1bHRzL2NvbmdfZGZfYWR1bHRzLlJEUyIpCiAgCn0gZWxzZSB7CiAgCiAgYnNfYWR1bHRzIDwtIGxvYWRpbmdzX2FkdWx0cyAlPiUKICAgIHNlbGVjdChjYXBhY2l0eSwgZmFjdG9yLCBsb2FkaW5nKSAlPiUKICAgIHNwcmVhZChmYWN0b3IsIGxvYWRpbmcpICU+JQogICAgc2VsZWN0KC1jYXBhY2l0eSkgJT4lCiAgICBib290c3RyYXAoMTAwMCkgCiAgCiAgZmFjdG9ycyA8LSBsZXZlbHMoZmFjdG9yKGxvYWRpbmdzX2FkdWx0cyRmYWN0b3IpKQogIAogIGNvbmdfZGZfYWR1bHRzIDwtIGRhdGEuZnJhbWUoTlVMTCkKICBmb3IgKGkgaW4gZmFjdG9ycykgewogICAgZm9yIChqIGluIGZhY3RvcnMpIHsKICAgICAgY25hbWUgPC0gcGFzdGUoaSwgaiwgc2VwID0gIi4iKQogICAgICB0ZW1wIDwtIGJzX2FkdWx0cyAlPiUKICAgICAgICBtdXRhdGUoY29uZyA9IG1hcF9kYmwoc3RyYXAsIH5jb3NpbmUoYXMuZGF0YS5mcmFtZSgueClbLGldLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhcy5kYXRhLmZyYW1lKC54KVssal0pKSkKICAgICAgY29uZ19kZl9hZHVsdHNbMToxMDAwLCBjbmFtZV0gPC0gdGVtcCRjb25nCiAgICB9CiAgfQogIAogIGNvbmdfZGZfYWR1bHRzIDwtIGNvbmdfZGZfYWR1bHRzICU+JQogICAgZ2F0aGVyKGZhY3Rvcl9wYWlyLCBjb25nKSAlPiUKICAgIHNlcGFyYXRlKGZhY3Rvcl9wYWlyLCBpbnRvID0gYygiZmFjdG9yX0EiLCAiZmFjdG9yX0IiKSwgc2VwID0gIlxcLiIpICU+JQogICAgZ3JvdXBfYnkoZmFjdG9yX0EsIGZhY3Rvcl9CKSAlPiUKICAgIHN1bW1hcmlzZShtZWFuID0gbWVhbihjb25nKSwKICAgICAgICAgICAgICBjaV9sb3dlciA9IGNpX2xvd2VyKGNvbmcpLAogICAgICAgICAgICAgIGNpX3VwcGVyID0gY2lfdXBwZXIoY29uZykpICU+JQogICAgdW5ncm91cCgpICU+JQogICAgbGVmdF9qb2luKGZhY3Rvcl9uYW1lc19hZHVsdHMgJT4lCiAgICAgICAgICAgICAgICByZW5hbWVfYWxsKGZ1bnMocGFzdGUoLiwgIkEiLCBzZXAgPSAiXyIpKSkpICU+JQogICAgbGVmdF9qb2luKGZhY3Rvcl9uYW1lc19hZHVsdHMgJT4lCiAgICAgICAgICAgICAgICByZW5hbWVfYWxsKGZ1bnMocGFzdGUoLiwgIkIiLCBzZXAgPSAiXyIpKSkpCiAgCiAgcm0oaSwgaiwgY25hbWUsIHRlbXAsIGZhY3RvcnMpCiAgCiAgc2F2ZVJEUyhjb25nX2RmX2FkdWx0cywgZmlsZSA9ICIuLi9yZXN1bHRzL2NvbmdfZGZfYWR1bHRzLlJEUyIpCn0KYGBgCgpgYGB7ciBjb25nIG1pbiBhZHVsdHN9CiMgZmluZCBtaW5pbXVtIHZhbHVlIHRvIHNldCBjb25zdGFudCBsb3dlciBib3VuZCBvZiBwbG90cwptaW5fY29uZ19hZHVsdHMgPC0gY29uZ19kZl9hZHVsdHMgJT4lCiAgc3VtbWFyaXNlKG1pbl9jb25nID0gbWluKGNpX2xvd2VyLCBuYS5ybSA9IFQpKQpgYGAKCmBgYHtyIGNvbmcgY2lzIHVzIGJhc2UgYWR1bHRzLCBmaWcud2lkdGggPSA0LCBmaWcuYXNwID0gMC45fQojIEZJR1VSRSAzCmNvbmdfcGxvdF9mdW4oY29uZ19kZiA9IGNvbmdfZGZfYWR1bHRzLCB3aGljaF9jb3VudHJ5ID0gIlVTIikgKwogIHlsaW0obWluX2NvbmdfYWR1bHRzJG1pbl9jb25nLCAxKSArCiAgIyB5bGltKE5BLCAxKSArCiAgbGFicyh4ID0gTlVMTCkKZ2dzYXZlKCIuLi9maWd1cmVzL2ZpZzAzLnBuZyIpCmBgYAoKYGBge3IgY29uZyBjaXMgZ2ggYmFzZSBhZHVsdHMsIGZpZy53aWR0aCA9IDQsIGZpZy5hc3AgPSAwLjl9CiMgRklHVVJFIFMxCmNvbmdfcGxvdF9mdW4oY29uZ19kZiA9IGNvbmdfZGZfYWR1bHRzICU+JQogICAgICAgICAgICAgICAgbXV0YXRlX2F0KCN2YXJzKGNvbnRhaW5zKCJsYWJkZXNjcmlwdCIpKSwKICAgICAgICAgICAgICAgICAgdmFycyhmYWN0b3JfbGFiZGVzY3JpcHRfQSksCiAgICAgICAgICAgICAgICAgIGZ1bnMoZ3N1YigiIFxcKCIsICJcblxcKCIsIC4pKSkgJT4lCiAgICAgICAgICAgICAgICBtdXRhdGVfYXQoI3ZhcnMoY29udGFpbnMoImxhYmRlc2NyaXB0IikpLAogICAgICAgICAgICAgICAgICB2YXJzKGZhY3Rvcl9sYWJkZXNjcmlwdF9BKSwKICAgICAgICAgICAgICAgICAgZnVucyhnc3ViKCJcXC8iLCAiXFwvXG4iLCAuKSkpLCAKICAgICAgICAgICAgICB3aGljaF9jb3VudHJ5ID0gIkdoYW5hIikgKwogIHlsaW0obWluX2NvbmdfYWR1bHRzJG1pbl9jb25nLCAxKQpnZ3NhdmUoIi4uL2ZpZ3VyZXMvZmlnUzAxLnBuZyIpCmBgYAoKYGBge3IgY29uZyBjaXMgdGggYmFzZSBhZHVsdHMsIGZpZy53aWR0aCA9IDQsIGZpZy5hc3AgPSAwLjl9CiMgRklHVVJFIFMyCmNvbmdfcGxvdF9mdW4oY29uZ19kZiA9IGNvbmdfZGZfYWR1bHRzLCAKICAgICAgICAgICAgICB3aGljaF9jb3VudHJ5ID0gIlRoYWlsYW5kIikgKwogIHlsaW0obWluX2NvbmdfYWR1bHRzJG1pbl9jb25nLCAxKQpnZ3NhdmUoIi4uL2ZpZ3VyZXMvZmlnUzAyLnBuZyIpCmBgYAoKYGBge3IgY29uZyBjaXMgY2ggYmFzZSBhZHVsdHMsIGZpZy53aWR0aCA9IDQsIGZpZy5hc3AgPSAwLjl9CiMgRklHVVJFIFMzCmNvbmdfcGxvdF9mdW4oY29uZ19kZiA9IGNvbmdfZGZfYWR1bHRzLCAKICAgICAgICAgICAgICB3aGljaF9jb3VudHJ5ID0gIkNoaW5hIikgKwogIHlsaW0obWluX2NvbmdfYWR1bHRzJG1pbl9jb25nLCAxKQpnZ3NhdmUoIi4uL2ZpZ3VyZXMvZmlnUzAzLnBuZyIpCmBgYAoKYGBge3IgY29uZyBjaXMgdnQgYmFzZSBhZHVsdHMsIGZpZy53aWR0aCA9IDQsIGZpZy5hc3AgPSAwLjl9CiMgRklHVVJFIFM0CmNvbmdfcGxvdF9mdW4oY29uZ19kZiA9IGNvbmdfZGZfYWR1bHRzICU+JQogICAgICAgICAgICAgICAgbXV0YXRlX2F0KCN2YXJzKGNvbnRhaW5zKCJsYWJkZXNjcmlwdCIpKSwKICAgICAgICAgICAgICAgICAgdmFycyhmYWN0b3JfbGFiZGVzY3JpcHRfQSksCiAgICAgICAgICAgICAgICAgIGZ1bnMoZ3N1YigiIFxcKCIsICJcblxcKCIsIC4pKSkgJT4lCiAgICAgICAgICAgICAgICBtdXRhdGVfYXQoI3ZhcnMoY29udGFpbnMoImxhYmRlc2NyaXB0IikpLAogICAgICAgICAgICAgICAgICB2YXJzKGZhY3Rvcl9sYWJkZXNjcmlwdF9BKSwKICAgICAgICAgICAgICAgICAgZnVucyhnc3ViKCJcXC8iLCAiXFwvXG4iLCAuKSkpLCAKICAgICAgICAgICAgICB3aGljaF9jb3VudHJ5ID0gIlZhbnVhdHUiKSArCiAgeWxpbShtaW5fY29uZ19hZHVsdHMkbWluX2NvbmcsIDEpCmdnc2F2ZSgiLi4vZmlndXJlcy9maWdTMDQucG5nIikKYGBgCgpgYGB7ciBib2R5IG1pbmQgY29uZyBhZHVsdHN9CiMgIkluIGVhY2ggc2FtcGxlLCB0aGVyZSB3YXMgYSBmYWN0b3IgdGhhdCB3YXMgc2ltaWxhciB0byBVUyBhZHVsdHPigJkg4oCcYm9keeKAnSBmYWN0b3IuLi4KY29uZ19kZl9hZHVsdHMgJT4lIAogIGZpbHRlcihncmVwbCgiYm9keSIsIHRvbG93ZXIoZmFjdG9yX2Rlc2NyaXB0X0EpKSwgCiAgICAgICAgIGdyZXBsKCJib2R5IiwgdG9sb3dlcihmYWN0b3JfZGVzY3JpcHRfQikpLAogICAgICAgICBjb3VudHJ5X0EgIT0gIlVTIiwgY291bnRyeV9CID09ICJVUyIpCgojICIuLi5hbmQgbm90IHNpbWlsYXIgdG8gdGhlIFVTIGFkdWx0IOKAnG1pbmTigJ0gZmFjdG9yLCAuLi4KY29uZ19kZl9hZHVsdHMgJT4lIAogIGZpbHRlcihncmVwbCgiYm9keSIsIHRvbG93ZXIoZmFjdG9yX2Rlc2NyaXB0X0EpKSwgCiAgICAgICAgIGdyZXBsKCJtaW5kIiwgdG9sb3dlcihmYWN0b3JfZGVzY3JpcHRfQikpLAogICAgICAgICBjb3VudHJ5X0EgIT0gIlVTIiwgY291bnRyeV9CID09ICJVUyIpCgojICIuLi4gYW5kIGEgZmFjdG9yIHRoYXQgd2FzIHNpbWlsYXIgdG8gVVMgYWR1bHRz4oCZIOKAnG1pbmTigJ0gZmFjdG9yLi4uCmNvbmdfZGZfYWR1bHRzICU+JSAKICBmaWx0ZXIoZ3JlcGwoIm1pbmQiLCB0b2xvd2VyKGZhY3Rvcl9kZXNjcmlwdF9BKSksIAogICAgICAgICBncmVwbCgibWluZCIsIHRvbG93ZXIoZmFjdG9yX2Rlc2NyaXB0X0IpKSwKICAgICAgICAgY291bnRyeV9BICE9ICJVUyIsIGNvdW50cnlfQiA9PSAiVVMiKQoKIyAiLi4uYW5kIG5vdCBzaW1pbGFyIHRvIHRoZSBVUyBhZHVsdCDigJxib2R54oCdIGZhY3Rvci4iCmNvbmdfZGZfYWR1bHRzICU+JSAKICBmaWx0ZXIoZ3JlcGwoIm1pbmQiLCB0b2xvd2VyKGZhY3Rvcl9kZXNjcmlwdF9BKSksIAogICAgICAgICBncmVwbCgiYm9keSIsIHRvbG93ZXIoZmFjdG9yX2Rlc2NyaXB0X0IpKSwKICAgICAgICAgY291bnRyeV9BICE9ICJVUyIsIGNvdW50cnlfQiA9PSAiVVMiKQpgYGAKCgojIENoaWxkcmVuCgojIyBTYW1wbGVzCgpgYGB7ciBzYW1wbGVzIGNoaWxkcmVufQpiaW5kX3Jvd3MoZF91c19jaGlsZHJlbiwgZF9naF9jaGlsZHJlbiwgZF90aF9jaGlsZHJlbiwgZF9jaF9jaGlsZHJlbiwgZF92dF9jaGlsZHJlbikgJT4lCiAgbXV0YXRlKGNvdW50cnkgPSBmYWN0b3IoY291bnRyeSwgbGV2ZWxzID0gbGV2ZWxzX2NvdW50cnkpKSAlPiUKICBkaXN0aW5jdChjb3VudHJ5LCBzdWJqX2lkKSAlPiUKICBjb3VudChjb3VudHJ5KSAlPiUgCiAgamFuaXRvcjo6YWRvcm5fdG90YWxzKCkKYGBgCgojIyBTY2FsZSB1c2UKCmBgYHtyIHNjYWxlIHVzZSBtZWFuIG92ZXJhbGwgY2hpbGRyZW59CmJpbmRfcm93cyhkX3VzX2NoaWxkcmVuLCBkX2doX2NoaWxkcmVuLCBkX3RoX2NoaWxkcmVuLCBkX2NoX2NoaWxkcmVuLCBkX3Z0X2NoaWxkcmVuKSAlPiUKICBtdXRhdGUoY291bnRyeSA9IGZhY3Rvcihjb3VudHJ5LCBsZXZlbHMgPSBsZXZlbHNfY291bnRyeSksCiAgICAgICAgIHJlc3BvbnNlX2NhdCA9IHJlY29kZV9mYWN0b3IocmVzcG9uc2VfY2F0LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJubyIgPSAibm8iLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJraW5kIG9mIiA9ICJraW5kIG9mIiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAieWVzIiA9ICJ5ZXMiLCAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAubWlzc2luZyA9ICJtaXNzaW5nIGRhdGEiKSkgJT4lCiAgY291bnQoY291bnRyeSwgcmVzcG9uc2VfY2F0KSAlPiUKICBjb21wbGV0ZShyZXNwb25zZV9jYXQsIG5lc3RpbmcoY291bnRyeSksIGZpbGwgPSBsaXN0KG4gPSAwKSkgJT4lCiAgZ3JvdXBfYnkoY291bnRyeSkgJT4lCiAgbXV0YXRlKHByb3AgPSBuL3N1bShuLCBuYS5ybSA9IFQpKSAlPiUKICB1bmdyb3VwKCkgJT4lCiAgc2VsZWN0KC1uKSAlPiUKICBzcHJlYWQocmVzcG9uc2VfY2F0LCBwcm9wKSAlPiUKICBqYW5pdG9yOjphZG9ybl9wY3RfZm9ybWF0dGluZyhkaWdpdHMgPSAyKQpgYGAKCiMjIEZhY3RvciByZXRlbnRpb246IHBhcmFsbGVsIGFuYWx5c2lzCgpgYGB7ciBwYXJhbGxlbCBkaXN0IGNoaWxkcmVuLCBmaWcud2lkdGggPSAzLCBmaWcuYXNwID0gMC41fQojIE5PVEU6IHRoZXJlIGFwcGVhcnMgdG8gYmUgc29tZSB1bnJlbGlhYmlsaXR5L25vbi1yZXByb2R1Y2liaWxpdHkgaW4gcmVzdWx0cywgZXNwZWNpYWxseSBmb3IgdnQgYWR1bHRzLCB3aGljaCBJIGRvbid0IHVuZGVyc3RhbmQgLS0gc28gaGVyZSdzIHRoZSBkaXN0cmlidXRpb24gb3ZlciBvdXRjb21lcyBvZiBwYXJhbGxlbCBhbmFseXNpcyB3aXRoIDEwMCBpdGVyYXRpb25zLiBXZSdsbCBjaG9vc2UgdGhlIG1lZGlhbiBudW1iZXIgb2YgZmFjdG9ycy4KCmlmIChmaWxlLmV4aXN0cygiLi4vcmVzdWx0cy9wYV9vdXRjb21lc19kaXN0X2NoaWxkcmVuLlJEUyIpKSB7CiAgCiAgcGFfb3V0Y29tZXNfZGlzdF9jaGlsZHJlbiA8LSByZWFkUkRTKCIuLi9yZXN1bHRzL3BhX291dGNvbWVzX2Rpc3RfY2hpbGRyZW4uUkRTIikKICAKfSBlbHNlIHsKICAKICBwYV9vdXRjb21lc19kaXN0X2NoaWxkcmVuIDwtIGRhdGEuZnJhbWUodXMgPSBOVUxMLCBnaCA9IE5VTEwsIHRoID0gTlVMTCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2ggPSBOVUxMLCB2dCA9IE5VTEwpCiAgCiAgc2V0LnNlZWQoNTQzMjEpCiAgbl9jb3JlcyA8LSBwYXJhbGxlbDo6ZGV0ZWN0Q29yZXMoKQogIG9wdGlvbnMobWMuY29yZXMgPSBuX2NvcmVzKQogIAogIGZvciAoaSBpbiAxOjEwMCkgewogICAgcGFfb3V0Y29tZXNfZGlzdF9jaGlsZHJlbltpLCAidXMiXSA8LSBmYS5wYXJhbGxlbChkX3VzX2NoaWxkcmVuX3csIHBsb3QgPSBGKSRuZmFjdAogICAgcGFfb3V0Y29tZXNfZGlzdF9jaGlsZHJlbltpLCAiZ2giXSA8LSBmYS5wYXJhbGxlbChkX2doX2NoaWxkcmVuX3csIHBsb3QgPSBGKSRuZmFjdCAgICAgCiAgICBwYV9vdXRjb21lc19kaXN0X2NoaWxkcmVuW2ksICJ0aCJdIDwtIGZhLnBhcmFsbGVsKGRfdGhfY2hpbGRyZW5fdywgcGxvdCA9IEYpJG5mYWN0CiAgICBwYV9vdXRjb21lc19kaXN0X2NoaWxkcmVuW2ksICJjaCJdIDwtIGZhLnBhcmFsbGVsKGRfY2hfY2hpbGRyZW5fdywgcGxvdCA9IEYpJG5mYWN0CiAgICBwYV9vdXRjb21lc19kaXN0X2NoaWxkcmVuW2ksICJ2dCJdIDwtIGZhLnBhcmFsbGVsKGRfdnRfY2hpbGRyZW5fdywgcGxvdCA9IEYpJG5mYWN0CiAgfQogIAogIHNhdmVSRFMocGFfb3V0Y29tZXNfZGlzdF9jaGlsZHJlbiwgZmlsZSA9ICIuLi9yZXN1bHRzL3BhX291dGNvbWVzX2Rpc3RfY2hpbGRyZW4uUkRTIikKfQoKIyBwbG90CnBhX291dGNvbWVzX2Rpc3RfY2hpbGRyZW4gJT4lCiAgcm93bmFtZXNfdG9fY29sdW1uKCJpdGVyIikgJT4lCiAgZ2F0aGVyKGNvdW50cnksIG5mYWN0LCAtaXRlcikgJT4lCiAgbXV0YXRlKGNvdW50cnkgPSBmYWN0b3IoY291bnRyeSwKICAgICAgICAgICAgICAgICAgICAgICAgICBsZXZlbHMgPSBjKCJ1cyIsICJnaCIsICJ0aCIsICJjaCIsICJ2dCIpLAogICAgICAgICAgICAgICAgICAgICAgICAgIGxhYmVscyA9IGxldmVsc19jb3VudHJ5KSkgJT4lCiAgZ2dwbG90KGFlcyh4ID0gbmZhY3QpKSArCiAgZmFjZXRfZ3JpZCh+IGNvdW50cnkpICsKICBnZW9tX2JhcihzdGF0ID0gImNvdW50IikgKwogIHNjYWxlX3hfY29udGludW91cyhsaW1pdHMgPSBjKDEsIG1heChwYV9vdXRjb21lc19kaXN0X2NoaWxkcmVuKSArIDEpLAogICAgICAgICAgICAgICAgICAgICBicmVha3MgPSBzZXEoMCwgMTAwLCAxKSkgKwogIGxhYnMoeCA9ICJOdW1iZXIgb2YgZmFjdG9ycyBzdWdnZXN0ZWQgYnkgZmEucGFyYWxsZWwoKSIpCmBgYAoKIyMgRXhwbG9yYXRvcnkgZmFjdG9yIGFuYWx5c2lzCgpgYGB7ciBlZmEgY2hpbGRyZW59CnNldC5zZWVkKDU0MzIxKQoKIyBkbyBleHBsb3JhdG9yeSBmYWN0b3IgYW5hbHlzaXM6IGNoaWxkcmVuCmVmYV91c19jaGlsZHJlbiA8LSBmYV9mdW4oZF91c19jaGlsZHJlbl93LCBuID0gbWVkaWFuKHBhX291dGNvbWVzX2Rpc3RfY2hpbGRyZW4kdXMpKQpjb2xuYW1lcyhlZmFfdXNfY2hpbGRyZW4kbG9hZGluZ3MpIDwtIHBhc3RlMCgidXNDSElMRFJFTl8iLCAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29sbmFtZXMoZWZhX3VzX2NoaWxkcmVuJGxvYWRpbmdzKSkKCmVmYV9naF9jaGlsZHJlbiA8LSBmYV9mdW4oZF9naF9jaGlsZHJlbl93LCBuID0gbWVkaWFuKHBhX291dGNvbWVzX2Rpc3RfY2hpbGRyZW4kZ2gpKQpjb2xuYW1lcyhlZmFfZ2hfY2hpbGRyZW4kbG9hZGluZ3MpIDwtIHBhc3RlMCgiZ2hDSElMRFJFTl8iLCAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29sbmFtZXMoZWZhX2doX2NoaWxkcmVuJGxvYWRpbmdzKSkKCmVmYV90aF9jaGlsZHJlbiA8LSBmYV9mdW4oZF90aF9jaGlsZHJlbl93LCBuID0gbWVkaWFuKHBhX291dGNvbWVzX2Rpc3RfY2hpbGRyZW4kdGgpKQpjb2xuYW1lcyhlZmFfdGhfY2hpbGRyZW4kbG9hZGluZ3MpIDwtIHBhc3RlMCgidGhDSElMRFJFTl8iLCAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29sbmFtZXMoZWZhX3RoX2NoaWxkcmVuJGxvYWRpbmdzKSkKCmVmYV9jaF9jaGlsZHJlbiA8LSBmYV9mdW4oZF9jaF9jaGlsZHJlbl93LCBuID0gbWVkaWFuKHBhX291dGNvbWVzX2Rpc3RfY2hpbGRyZW4kY2gpKQpjb2xuYW1lcyhlZmFfY2hfY2hpbGRyZW4kbG9hZGluZ3MpIDwtIHBhc3RlMCgiY2hDSElMRFJFTl8iLCAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29sbmFtZXMoZWZhX2NoX2NoaWxkcmVuJGxvYWRpbmdzKSkKCmVmYV92dF9jaGlsZHJlbiA8LSBmYV9mdW4oZF92dF9jaGlsZHJlbl93LCBuID0gbWVkaWFuKHBhX291dGNvbWVzX2Rpc3RfY2hpbGRyZW4kdnQpKQpjb2xuYW1lcyhlZmFfdnRfY2hpbGRyZW4kbG9hZGluZ3MpIDwtIHBhc3RlMCgidnRDSElMRFJFTl8iLCAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29sbmFtZXMoZWZhX3Z0X2NoaWxkcmVuJGxvYWRpbmdzKSkKYGBgCgpgYGB7ciBmYWN0b3IgbmFtZXMgY2hpbGRyZW59CmZhY3Rvcl9uYW1lc19jaGlsZHJlbiA8LSBkYXRhLmZyYW1lKGZhY3RvciA9IGMoY29sbmFtZXMoZWZhX3VzX2NoaWxkcmVuJGxvYWRpbmdzKSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb2xuYW1lcyhlZmFfZ2hfY2hpbGRyZW4kbG9hZGluZ3MpLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbG5hbWVzKGVmYV90aF9jaGlsZHJlbiRsb2FkaW5ncyksCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29sbmFtZXMoZWZhX2NoX2NoaWxkcmVuJGxvYWRpbmdzKSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb2xuYW1lcyhlZmFfdnRfY2hpbGRyZW4kbG9hZGluZ3MpKSkgJT4lCiAgbXV0YXRlKGFnZV9ncm91cCA9ICJjaGlsZHJlbiIpICU+JQogIG11dGF0ZShjb3VudHJ5ID0gY2FzZV93aGVuKGdyZXBsKCJedXMiLCBmYWN0b3IpIH4gIlVTIiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICBncmVwbCgiXmdoIiwgZmFjdG9yKSB+ICJHaGFuYSIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZ3JlcGwoIl50aCIsIGZhY3RvcikgfiAiVGhhaWxhbmQiLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgIGdyZXBsKCJeY2giLCBmYWN0b3IpIH4gIkNoaW5hIiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICBncmVwbCgiXnZ0IiwgZmFjdG9yKSB+ICJWYW51YXR1IiksCiAgICAgICAgIGNvdW50cnkgPSBmYWN0b3IoY291bnRyeSwgbGV2ZWxzX2NvdW50cnkpKSAlPiUKICBtdXRhdGUoZmFjdG9yX25hbWUgPSBnc3ViKCJedXMiLCAiVVMgIiwgZmFjdG9yKSwKICAgICAgICAgZmFjdG9yX25hbWUgPSBnc3ViKCJeZ2giLCAiR2guICIsIGZhY3Rvcl9uYW1lKSwKICAgICAgICAgZmFjdG9yX25hbWUgPSBnc3ViKCJedGgiLCAiVGguICIsIGZhY3Rvcl9uYW1lKSwKICAgICAgICAgZmFjdG9yX25hbWUgPSBnc3ViKCJeY2giLCAiQ2guICIsIGZhY3Rvcl9uYW1lKSwKICAgICAgICAgZmFjdG9yX25hbWUgPSBnc3ViKCJednQiLCAiVmEuICIsIGZhY3Rvcl9uYW1lKSwKICAgICAgICAgZmFjdG9yX25hbWUgPSBnc3ViKCJDSElMRFJFTiIsICJjaGlsZHJlbiIsIGZhY3Rvcl9uYW1lKSwKICAgICAgICAgZmFjdG9yX25hbWUgPSBnc3ViKCJfRiIsICIgRmFjdG9yICIsIGZhY3Rvcl9uYW1lKSkgJT4lCiAgbXV0YXRlKGZhY3Rvcl9kZXNjcmlwdCA9IHJlY29kZShmYWN0b3IsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1c0NISUxEUkVOX0YxID0gIkJvZHktbGlrZSwgbmVnYXRpdmUiLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdXNDSElMRFJFTl9GMiA9ICJIZWFydC1saWtlLCBwb3NpdGl2ZSIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1c0NISUxEUkVOX0YzID0gIk1pbmQtbGlrZSIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBnaENISUxEUkVOX0YxID0gIkJvZHktbGlrZSwgbmVnYXRpdmUiLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZ2hDSElMRFJFTl9GMiA9ICJNaW5kLWxpa2UsIHBvc2l0aXZlIiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGdoQ0hJTERSRU5fRjMgPSAiUHJheSwgYWRkLCBldGMuIiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoQ0hJTERSRU5fRjEgPSAiQm9keS1saWtlL3Bvc2l0aXZlIiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoQ0hJTERSRU5fRjIgPSAiSGVhcnQtbGlrZSwgbmVnYXRpdmUiLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhDSElMRFJFTl9GMyA9ICJNaW5kLWxpa2UiLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhDSElMRFJFTl9GNCA9ICJBZGQsIHByYXksIGV0Yy4iLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2hDSElMRFJFTl9GMSA9ICJIZWFydC1saWtlIiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNoQ0hJTERSRU5fRjIgPSAiTWluZC1saWtlIiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNoQ0hJTERSRU5fRjMgPSAiQm9keS1saWtlIiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNoQ0hJTERSRU5fRjQgPSAiUHJheSwgZXRjLiIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2dENISUxEUkVOX0YxID0gIkJvZHktbGlrZSIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2dENISUxEUkVOX0YyID0gIk1pbmQtbGlrZSIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2dENISUxEUkVOX0YzID0gIkhlYXJ0LWxpa2UiKSwKICAgICAgICAgZmFjdG9yX2xhYmRlc2NyaXB0ID0gcGFzdGUoZ3N1YigiLipfRiIsICJGIiwgZmFjdG9yKSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmFjdG9yX2Rlc2NyaXB0LCBzZXAgPSAiOiAiKSkKYGBgCgojIyBGYWN0b3IgbG9hZGluZ3MKCmBgYHtyIG9yZGVyIGNoaWxkcmVufQojIG9yZGVyIGNhcGFjaXRpZXM6IGNoaWxkcmVuCm9yZGVyX3VzX2NoaWxkcmVuIDwtIGZhLnNvcnQoZWZhX3VzX2NoaWxkcmVuKSRsb2FkaW5nc1tdICU+JSByb3duYW1lcygpCm9yZGVyX2doX2NoaWxkcmVuIDwtIGZhLnNvcnQoZWZhX2doX2NoaWxkcmVuKSRsb2FkaW5nc1tdICU+JSByb3duYW1lcygpCm9yZGVyX3RoX2NoaWxkcmVuIDwtIGZhLnNvcnQoZWZhX3RoX2NoaWxkcmVuKSRsb2FkaW5nc1tdICU+JSByb3duYW1lcygpCm9yZGVyX2NoX2NoaWxkcmVuIDwtIGZhLnNvcnQoZWZhX2NoX2NoaWxkcmVuKSRsb2FkaW5nc1tdICU+JSByb3duYW1lcygpCm9yZGVyX3Z0X2NoaWxkcmVuIDwtIGZhLnNvcnQoZWZhX3Z0X2NoaWxkcmVuKSRsb2FkaW5nc1tdICU+JSByb3duYW1lcygpCmBgYAoKYGBge3IgbG9hZGluZ3MgY2hpbGRyZW59CiMgY29tcGlsZSBsb2FkaW5nczogY2hpbGRyZW4KbG9hZGluZ3NfY2hpbGRyZW4gPC0gYmluZF9yb3dzKAogIGxvYWRpbmdzX2Z1bihlZmFfdXNfY2hpbGRyZW4pICU+JSBtdXRhdGUoY291bnRyeSA9ICJVUyIpLAogIGxvYWRpbmdzX2Z1bihlZmFfZ2hfY2hpbGRyZW4pICU+JSBtdXRhdGUoY291bnRyeSA9ICJHaGFuYSIpLAogIGxvYWRpbmdzX2Z1bihlZmFfdGhfY2hpbGRyZW4pICU+JSBtdXRhdGUoY291bnRyeSA9ICJUaGFpbGFuZCIpLAogIGxvYWRpbmdzX2Z1bihlZmFfY2hfY2hpbGRyZW4pICU+JSBtdXRhdGUoY291bnRyeSA9ICJDaGluYSIpLAogIGxvYWRpbmdzX2Z1bihlZmFfdnRfY2hpbGRyZW4pICU+JSBtdXRhdGUoY291bnRyeSA9ICJWYW51YXR1IikpICU+JQogIG11dGF0ZShjb3VudHJ5ID0gZmFjdG9yKGNvdW50cnksIGxldmVscyA9IGxldmVsc19jb3VudHJ5KSwKICAgICAgICAgY2FwYWNpdHlfb3JkX3VzID0gZmFjdG9yKGNhcGFjaXR5LCBsZXZlbHMgPSBvcmRlcl91c19jaGlsZHJlbiksCiAgICAgICAgIGNhcGFjaXR5X29yZF9naCA9IGZhY3RvcihjYXBhY2l0eSwgbGV2ZWxzID0gb3JkZXJfZ2hfY2hpbGRyZW4pLAogICAgICAgICBjYXBhY2l0eV9vcmRfdGggPSBmYWN0b3IoY2FwYWNpdHksIGxldmVscyA9IG9yZGVyX3RoX2NoaWxkcmVuKSwKICAgICAgICAgY2FwYWNpdHlfb3JkX2NoID0gZmFjdG9yKGNhcGFjaXR5LCBsZXZlbHMgPSBvcmRlcl9jaF9jaGlsZHJlbiksCiAgICAgICAgIGNhcGFjaXR5X29yZF92dCA9IGZhY3RvcihjYXBhY2l0eSwgbGV2ZWxzID0gb3JkZXJfdnRfY2hpbGRyZW4pKSAlPiUKICBhcnJhbmdlKGNvdW50cnksIGZhY3RvciwgZGVzYyhhYnMobG9hZGluZykpLCBjYXBhY2l0eSkgJT4lCiAgbXV0YXRlKG9yZGVyID0gMTpucm93KC4pKSAlPiUKICBsZWZ0X2pvaW4oZmFjdG9yX25hbWVzX2NoaWxkcmVuKQpgYGAKCmBgYHtyIGhlYXRtYXBzIGJ5IHNpdGUgY2hpbGRyZW4sIGZpZy53aWR0aCA9IDE1LCBmaWcuYXNwID0gMC4yNX0KcGxvdF9ncmlkKGhlYXRtYXBfZnVuKGVmYV91c19jaGlsZHJlbiwgCiAgICAgICAgICAgICAgICAgICAgICBmYWN0b3JfbmFtZXMgPSBmYWN0b3JfbmFtZXNfY2hpbGRyZW4gJT4lCiAgICAgICAgICAgICAgICAgICAgICAgIGZpbHRlcihjb3VudHJ5ID09ICJVUyIpICU+JQogICAgICAgICAgICAgICAgICAgICAgICBzZWxlY3QoZmFjdG9yX2xhYmRlc2NyaXB0KSAlPiUKICAgICAgICAgICAgICAgICAgICAgICAgdW5saXN0KCkpICsgCiAgICAgICAgICAgIHRoZW1lKGxlZ2VuZC5wb3NpdGlvbiA9ICJub25lIikgKwogICAgICAgICAgICBsYWJzKHRpdGxlID0gIlVTOiBjaGlsZHJlbiIpLAogICAgICAgICAgaGVhdG1hcF9mdW4oZWZhX2doX2NoaWxkcmVuLAogICAgICAgICAgICAgICAgICAgICAgZmFjdG9yX25hbWVzID0gZmFjdG9yX25hbWVzX2NoaWxkcmVuICU+JQogICAgICAgICAgICAgICAgICAgICAgICBmaWx0ZXIoY291bnRyeSA9PSAiR2hhbmEiKSAlPiUKICAgICAgICAgICAgICAgICAgICAgICAgc2VsZWN0KGZhY3Rvcl9sYWJkZXNjcmlwdCkgJT4lCiAgICAgICAgICAgICAgICAgICAgICAgIHVubGlzdCgpKSArIAogICAgICAgICAgICB0aGVtZShsZWdlbmQucG9zaXRpb24gPSAibm9uZSIpICsKICAgICAgICAgICAgbGFicyh0aXRsZSA9ICJHSEFOQTogY2hpbGRyZW4iKSwKICAgICAgICAgIGhlYXRtYXBfZnVuKGVmYV90aF9jaGlsZHJlbiwKICAgICAgICAgICAgICAgICAgICAgIGZhY3Rvcl9uYW1lcyA9IGZhY3Rvcl9uYW1lc19jaGlsZHJlbiAlPiUKICAgICAgICAgICAgICAgICAgICAgICAgZmlsdGVyKGNvdW50cnkgPT0gIlRoYWlsYW5kIikgJT4lCiAgICAgICAgICAgICAgICAgICAgICAgIHNlbGVjdChmYWN0b3JfbGFiZGVzY3JpcHQpICU+JQogICAgICAgICAgICAgICAgICAgICAgICB1bmxpc3QoKSkgKyAKICAgICAgICAgICAgdGhlbWUobGVnZW5kLnBvc2l0aW9uID0gIm5vbmUiKSArCiAgICAgICAgICAgIGxhYnModGl0bGUgPSAiVEhBSUxBTkQ6IGNoaWxkcmVuIiksCiAgICAgICAgICBoZWF0bWFwX2Z1bihlZmFfY2hfY2hpbGRyZW4sCiAgICAgICAgICAgICAgICAgICAgICBmYWN0b3JfbmFtZXMgPSBmYWN0b3JfbmFtZXNfY2hpbGRyZW4gJT4lCiAgICAgICAgICAgICAgICAgICAgICAgIGZpbHRlcihjb3VudHJ5ID09ICJDaGluYSIpICU+JQogICAgICAgICAgICAgICAgICAgICAgICBzZWxlY3QoZmFjdG9yX2xhYmRlc2NyaXB0KSAlPiUKICAgICAgICAgICAgICAgICAgICAgICAgdW5saXN0KCkpICsgCiAgICAgICAgICAgIHRoZW1lKGxlZ2VuZC5wb3NpdGlvbiA9ICJub25lIikgKwogICAgICAgICAgICBsYWJzKHRpdGxlID0gIkNISU5BOiBjaGlsZHJlbiIpLAogICAgICAgICAgaGVhdG1hcF9mdW4oZWZhX3Z0X2NoaWxkcmVuLAogICAgICAgICAgICAgICAgICAgICAgZmFjdG9yX25hbWVzID0gZmFjdG9yX25hbWVzX2NoaWxkcmVuICU+JQogICAgICAgICAgICAgICAgICAgICAgICBmaWx0ZXIoY291bnRyeSA9PSAiVmFudWF0dSIpICU+JQogICAgICAgICAgICAgICAgICAgICAgICBzZWxlY3QoZmFjdG9yX2xhYmRlc2NyaXB0KSAlPiUKICAgICAgICAgICAgICAgICAgICAgICAgdW5saXN0KCkpICsgCiAgICAgICAgICAgIHRoZW1lKGxlZ2VuZC5wb3NpdGlvbiA9ICJub25lIikgKwogICAgICAgICAgICBsYWJzKHRpdGxlID0gIlZBTlVBVFU6IGNoaWxkcmVuIiksCiAgICAgICAgICBuY29sID0gNSkKYGBgCgpgYGB7ciBoZWF0bWFwIGNoaWxkcmVuLCBmaWcud2lkdGggPSA1LCBmaWcuYXNwID0gMC43fQojIG1ha2UgaGVhdG1hcCBmaWd1cmU6IGNoaWxkcmVuCmxvYWRpbmdzX2NoaWxkcmVuICU+JQogIG11dGF0ZShmYWN0b3JfbnVtID0gYXMubnVtZXJpYyhnc3ViKCIuKkYiLCAiIiwgZmFjdG9yKSkpICU+JQogIG11dGF0ZShzYW1wbGUgPSBwYXN0ZShjb3VudHJ5LCAiY2hpbGRyZW4iLCBzZXAgPSAiXG4iKSkgJT4lCiAgbGVmdF9qb2luKGZhY3Rvcl9uYW1lc19jaGlsZHJlbikgJT4lCiAgbXV0YXRlKGNvdW50cnkgPSBmYWN0b3IoY291bnRyeSwgbGV2ZWxzID0gbGV2ZWxzX2NvdW50cnkpKSAlPiUKICBnZ3Bsb3QoYWVzKHggPSByZW9yZGVyKGZhY3Rvcl9sYWJkZXNjcmlwdCwgZmFjdG9yX251bSksIAogICAgICAgICAgICAgeSA9IHJlb3JkZXIoY2FwYWNpdHksIGRlc2MoY2FwYWNpdHlfb3JkX3VzKSksCiAgICAgICAgICAgICAjIHkgPSByZW9yZGVyKGNhcGFjaXR5LCBkZXNjKGNhcGFjaXR5X29yZF9lYykpLCAKICAgICAgICAgICAgICMgeSA9IHJlb3JkZXIoY2FwYWNpdHksIGRlc2MoY2FwYWNpdHlfb3JkX2doKSksCiAgICAgICAgICAgICAjIHkgPSByZW9yZGVyKGNhcGFjaXR5LCBkZXNjKGNhcGFjaXR5X29yZF90aCkpLAogICAgICAgICAgICAgIyB5ID0gcmVvcmRlcihjYXBhY2l0eSwgZGVzYyhjYXBhY2l0eV9vcmRfY2gpKSwKICAgICAgICAgICAgICMgeSA9IHJlb3JkZXIoY2FwYWNpdHksIGRlc2MoY2FwYWNpdHlfb3JkX3Z0KSksCiAgICAgICAgICAgICBmaWxsID0gbG9hZGluZykpICsKICBmYWNldF9ncmlkKH4gcmVvcmRlcihzYW1wbGUsIGFzLm51bWVyaWMoY291bnRyeSkpLCBzY2FsZXMgPSAiZnJlZSIsIHNwYWNlID0gImZyZWUiKSArCiAgZ2VvbV90aWxlKGNvbG9yID0gImJsYWNrIiwgc2l6ZSA9IDAuMikgKwogIGdlb21fdGV4dChhZXMobGFiZWwgPSBmb3JtYXQocm91bmQobG9hZGluZywgMiksIG5zbWFsbCA9IDIpKSwgc2l6ZSA9IDMpICsKICBzY2FsZV9maWxsX2Rpc3RpbGxlcihwYWxldHRlID0gIlJkWWxCdSIsIGxpbWl0cyA9IGMoLTEsIDEpLAogICAgICAgICAgICAgICAgICAgICAgIGd1aWRlID0gZ3VpZGVfY29sb3JiYXIoYmFyaGVpZ2h0ID0gMjAsIGJhcndpZHRoID0gMC41KSkgKwogIHRoZW1lX21pbmltYWwoKSArCiAgdGhlbWUoYXhpcy50ZXh0LnggPSBlbGVtZW50X3RleHQoYW5nbGUgPSA0NSwgaGp1c3QgPSAxLCB2anVzdCA9IDEpLAogICAgICAgIHBhbmVsLnNwYWNpbmcueCA9IHVuaXQoMC44LCAibGluZXMiKSwKICAgICAgICBzdHJpcC50ZXh0LnggPSBlbGVtZW50X3RleHQoc2l6ZSA9IDEwLCBmYWNlID0gImJvbGQiKSkgKwogIGxhYnMoeCA9IE5VTEwsIHkgPSAiQ2FwYWNpdHkiLCBmaWxsID0gIkZhY3RvclxubG9hZGluZyIpCmBgYAoKIyMgQ29uZ3J1ZW5jZQoKU2VlIFtBbGwgc2FtcGxlc10sIGJlbG93LgoKIyMgQm9vdHN0cmFwcGVkIGNvbmdydWVuY2UKCmBgYHtyIGJvb3RzdHJhcCBjb25ncnVlbmNlIGNoaWxkcmVufQppZiAoZmlsZS5leGlzdHMoIi4uL3Jlc3VsdHMvY29uZ19kZl9jaGlsZHJlbi5SRFMiKSkgewogIAogIGNvbmdfZGZfY2hpbGRyZW4gPC0gcmVhZFJEUygiLi4vcmVzdWx0cy9jb25nX2RmX2NoaWxkcmVuLlJEUyIpCiAgCn0gZWxzZSB7CiAgCiAgYnNfY2hpbGRyZW4gPC0gbG9hZGluZ3NfY2hpbGRyZW4gJT4lCiAgICBzZWxlY3QoY2FwYWNpdHksIGZhY3RvciwgbG9hZGluZykgJT4lCiAgICBzcHJlYWQoZmFjdG9yLCBsb2FkaW5nKSAlPiUKICAgIGZ1bGxfam9pbihsb2FkaW5nc19hZHVsdHMgJT4lCiAgICAgICAgICAgICAgICBzZWxlY3QoY2FwYWNpdHksIGZhY3RvciwgbG9hZGluZykgJT4lCiAgICAgICAgICAgICAgICBzcHJlYWQoZmFjdG9yLCBsb2FkaW5nKSkgJT4lCiAgICBzZWxlY3QoLWNhcGFjaXR5KSAlPiUKICAgIGJvb3RzdHJhcCgxMDAwKSAKICAKICBjb25nX2RmX2NoaWxkcmVuIDwtIGRhdGEuZnJhbWUoTlVMTCkKICAKICBmb3IgKGsgaW4gbGV2ZWxzX2NvdW50cnkpIHsKICAgIAogICAgZmFjdG9yc19jaGlsZHJlbiA8LSBsZXZlbHMoZmFjdG9yKGxvYWRpbmdzX2NoaWxkcmVuJGZhY3RvclsKICAgICAgbG9hZGluZ3NfY2hpbGRyZW4kY291bnRyeSA9PSBrXSkpCiAgICBmYWN0b3JzX2FkdWx0cyA8LSBsZXZlbHMoZmFjdG9yKGxvYWRpbmdzX2FkdWx0cyRmYWN0b3JbCiAgICAgIGxvYWRpbmdzX2FkdWx0cyRjb3VudHJ5ID09IGtdKSkKICAgIAogICAgZm9yIChpIGluIGZhY3RvcnNfY2hpbGRyZW4pIHsKICAgICAgZm9yIChqIGluIGZhY3RvcnNfYWR1bHRzKSB7CiAgICAgICAgY25hbWUgPC0gcGFzdGUoaSwgaiwgc2VwID0gIi4iKQogICAgICAgIHRlbXAgPC0gYnNfY2hpbGRyZW4gJT4lCiAgICAgICAgICBtdXRhdGUoY29uZyA9IG1hcF9kYmwoc3RyYXAsIH5jb3NpbmUoYXMuZGF0YS5mcmFtZSgueClbLGldLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFzLmRhdGEuZnJhbWUoLngpWyxqXSkpKQogICAgICAgIGNvbmdfZGZfY2hpbGRyZW5bMToxMDAwLCBjbmFtZV0gPC0gdGVtcCRjb25nCiAgICAgIH0KICAgIH0KICAgIAogICAgcm0oaSwgaiwgY25hbWUsIHRlbXAsIGZhY3RvcnNfY2hpbGRyZW4sIGZhY3RvcnNfYWR1bHRzKQogICAgCiAgfQogIAogIHJtKGspCiAgCiAgY29uZ19kZl9jaGlsZHJlbiA8LSBjb25nX2RmX2NoaWxkcmVuICU+JQogICAgZ2F0aGVyKGZhY3Rvcl9wYWlyLCBjb25nKSAlPiUKICAgIHNlcGFyYXRlKGZhY3Rvcl9wYWlyLCBpbnRvID0gYygiZmFjdG9yX0EiLCAiZmFjdG9yX0IiKSwgc2VwID0gIlxcLiIpICU+JQogICAgZ3JvdXBfYnkoZmFjdG9yX0EsIGZhY3Rvcl9CKSAlPiUKICAgIHN1bW1hcmlzZShtZWFuID0gbWVhbihjb25nKSwKICAgICAgICAgICAgICBjaV9sb3dlciA9IGNpX2xvd2VyKGNvbmcpLAogICAgICAgICAgICAgIGNpX3VwcGVyID0gY2lfdXBwZXIoY29uZykpICU+JQogICAgdW5ncm91cCgpICU+JQogICAgZnVsbF9qb2luKGZhY3Rvcl9uYW1lc19jaGlsZHJlbiAlPiUKICAgICAgICAgICAgICAgIHJlbmFtZV9hbGwoZnVucyhwYXN0ZSguLCAiQSIsIHNlcCA9ICJfIikpKSkgJT4lCiAgICBmdWxsX2pvaW4oZmFjdG9yX25hbWVzX2FkdWx0cyAlPiUKICAgICAgICAgICAgICAgIHJlbmFtZV9hbGwoZnVucyhwYXN0ZSguLCAiQiIsIHNlcCA9ICJfIikpKSkgJT4lCiAgICBtdXRhdGUoZmFjdG9yX2JobV9BID0gY2FzZV93aGVuKAogICAgICBncmVwbCgiYm9keSIsIHRvbG93ZXIoZmFjdG9yX2Rlc2NyaXB0X0EpKSB+ICJCb2R5LWxpa2VcbmNoaWxkIGZhY3RvciIsCiAgICAgIGdyZXBsKCJtaW5kIiwgdG9sb3dlcihmYWN0b3JfZGVzY3JpcHRfQSkpIH4gIk1pbmQtbGlrZVxuY2hpbGQgZmFjdG9yIiwKICAgICAgZ3JlcGwoImhlYXJ0IiwgdG9sb3dlcihmYWN0b3JfZGVzY3JpcHRfQSkpIH4gIkhlYXJ0LWxpa2VcbmNoaWxkIGZhY3RvciIsCiAgICAgIFRSVUUgfiAiT3RoZXIiKSkgJT4lCiAgICBtdXRhdGUoZmFjdG9yX2JobV9CID0gY2FzZV93aGVuKAogICAgICBncmVwbCgiYm9keSIsIHRvbG93ZXIoZmFjdG9yX2Rlc2NyaXB0X0IpKSB+ICJMb2NhbCBhZHVsdHM6XG5Cb2R5LWxpa2UgZmFjdG9yIiwKICAgICAgZ3JlcGwoIm1pbmQiLCB0b2xvd2VyKGZhY3Rvcl9kZXNjcmlwdF9CKSkgfiAiTG9jYWwgYWR1bHRzOlxuTWluZC1saWtlIGZhY3RvciIsCiAgICAgIGdyZXBsKCJoZWFydCIsIHRvbG93ZXIoZmFjdG9yX2Rlc2NyaXB0X0IpKSB+ICJMb2NhbCBhZHVsdHM6XG5IZWFydC1saWtlIGZhY3RvciIsCiAgICAgIFRSVUUgfiAiTG9jYWwgYWR1bHRzOlxuT3RoZXIgZmFjdG9yIikpCiAgCiAgc2F2ZVJEUyhjb25nX2RmX2NoaWxkcmVuLCBmaWxlID0gIi4uL3Jlc3VsdHMvY29uZ19kZl9jaGlsZHJlbi5SRFMiKQp9CmBgYAoKYGBge3IgY29uZyBtaW4gY2hpbGRyZW59CiMgZmluZCBtaW5pbXVtIHZhbHVlIHRvIHNldCBjb25zdGFudCBsb3dlciBib3VuZCBvZiBwbG90cwptaW5fY29uZ19jaGlsZHJlbiA8LSBjb25nX2RmX2NoaWxkcmVuICU+JQogIHN1bW1hcmlzZShtaW5fY29uZyA9IG1pbihjaV9sb3dlciwgbmEucm0gPSBUKSkKYGBgCgpgYGB7ciBjb25nIGNpcyBjaGlsZHJlbiwgZmlnLndpZHRoID0gNCwgZmlnLmFzcCA9IDEuNH0KIyBGSUdVUkUgNAojIGZpZy5hc3AgY2hvc2VuIHRvIGtlZXAgYWJzb2x1dGUgaGVpZ2h0IG9mIHktYXhpcyByZWxhdGl2ZWx5IHNpbWlsYXIgYWNyb3NzIGFkdWx0cyBhbmQgY2hpbGRyZW4KY29uZ19kZl9jaGlsZHJlbiAlPiUKICBtdXRhdGUoc2FtcGxlX0EgPSBwYXN0ZShjb3VudHJ5X0EsIGFnZV9ncm91cF9BLCBzZXAgPSAiXG4iKSkgJT4lCiAgZ2dwbG90KGFlcyh4ID0gZmFjdG9yX2xhYmRlc2NyaXB0X0EsIHkgPSBtZWFuKSkgKwogIGZhY2V0X2dyaWQoZmFjdG9yX2JobV9CIH4gcmVvcmRlcihzYW1wbGVfQSwgYXMubnVtZXJpYyhjb3VudHJ5X0EpKSwgCiAgICAgICAgICAgICBzY2FsZXMgPSAiZnJlZV94Iiwgc3BhY2UgPSAiZnJlZV94IikgKwogIGFubm90YXRlKCJyZWN0IiwgeG1pbiA9IC1JbmYsIHhtYXggPSBJbmYsIHltaW4gPSAtSW5mLCB5bWF4ID0gMC44NSwKICAgICAgICAgICBmaWxsID0gImdyYXkyMCIsIGFscGhhID0gMC4yKSArCiAgYW5ub3RhdGUoInJlY3QiLCB4bWluID0gLUluZiwgeG1heCA9IEluZiwgeW1pbiA9IDAuODUsIHltYXggPSAwLjk1LAogICAgICAgICAgIGZpbGwgPSB2aXJpZGlzTGl0ZTo6dmlyaWRpcygyLCBiZWdpbiA9IDAuNzUvMiwgZW5kID0gMC43NSlbMV0sIGFscGhhID0gMC4yKSArCiAgYW5ub3RhdGUoInJlY3QiLCB4bWluID0gLUluZiwgeG1heCA9IEluZiwgeW1pbiA9IDAuOTUsIHltYXggPSBJbmYsCiAgICAgICAgICAgZmlsbCA9IHZpcmlkaXNMaXRlOjp2aXJpZGlzKDIsIGJlZ2luID0gMC43NS8yLCBlbmQgPSAwLjc1KVsyXSwgYWxwaGEgPSAwLjIpICsKICBnZW9tX2hsaW5lKHlpbnRlcmNlcHQgPSAwLjg1LCBsdHkgPSAyLCBjb2xvciA9ICJncmF5MTAiKSArCiAgZ2VvbV9obGluZSh5aW50ZXJjZXB0ID0gMC45NSwgbHR5ID0gMiwgY29sb3IgPSAiZ3JheTEwIikgKwogIGdlb21fcG9pbnRyYW5nZShhZXMoeW1pbiA9IGNpX2xvd2VyLCB5bWF4ID0gY2lfdXBwZXIpLAogICAgICAgICAgICAgICAgICBmYXR0ZW4gPSAzLAogICAgICAgICAgICAgICAgICBzaG93LmxlZ2VuZCA9IEYpICsKICBnZW9tX3RleHQoYWVzKGxhYmVsID0gZm9ybWF0KHJvdW5kKG1lYW4sIDIpLCBuc21hbGwgPSAyKSwKICAgICAgICAgICAgICAgIHkgPSBpZmVsc2UoY2lfbG93ZXIgPCAwLjIsIGNpX3VwcGVyICsgMC4wNSwgY2lfbG93ZXIgLSAwLjA1KSwKICAgICAgICAgICAgICAgIHZqdXN0ID0gaWZlbHNlKGNpX2xvd2VyIDwgMC4yLCAwLCAxKSkpICsKICBzY2FsZV95X2NvbnRpbnVvdXMoYnJlYWtzID0gc2VxKC0xLCAxLCAwLjIpLAogICAgICAgICAgICAgICAgICAgICBleHBhbmQgPSBleHBhbnNpb24oYWRkID0gMC4wNSkpICsKICBzY2FsZV9jb2xvcl9icmV3ZXIocGFsZXR0ZSA9ICJEYXJrMiIsIGFlc3RoZXRpY3MgPSBjKCJjb2xvciIsICJmaWxsIikpICsKICBzY2FsZV9zaGFwZV9tYW51YWwodmFsdWVzID0gMjE6MjUpICsKICBsYWJzKHggPSBOVUxMLAogICAgICAgeSA9IGV4cHJlc3Npb24oIlNpbWlsYXJpdHkgIihpdGFsaWMocltjXSkpKSkgKyAKICBndWlkZXMoY29sb3IgPSAibm9uZSIsIGZpbGwgPSAibm9uZSIpICsKICB0aGVtZV9taW5pbWFsKCkgKwogIHRoZW1lKGF4aXMudGV4dC54ID0gZWxlbWVudF90ZXh0KGFuZ2xlID0gNDUsIGhqdXN0ID0gMSwgdmp1c3QgPSAxKSwKICAgICAgICBsZWdlbmQucG9zaXRpb24gPSAicmlnaHQiLAogICAgICAgIHBhbmVsLmJvcmRlciA9IGVsZW1lbnRfcmVjdChmaWxsID0gYWxwaGEoIndoaXRlIiwgMCksIGNvbG9yID0gImJsYWNrIiksCiAgICAgICAgc3RyaXAudGV4dCA9IGVsZW1lbnRfdGV4dChzaXplID0gMTAsIGZhY2UgPSAiYm9sZCIpLCAKICAgICAgICBwbG90Lm1hcmdpbiA9IHVuaXQoYyg1LjUsIDUuNSwgNS41LCAxNS41KSwgInBvaW50IikpCmdnc2F2ZSgiLi4vZmlndXJlcy9maWcwNC5wbmciKQpgYGAKCmBgYHtyIGJvZHkgbWluZCBjb25nIGNoaWxkcmVufQojICJJbiBlYWNoIHNhbXBsZSwgdGhlcmUgd2FzIGEgZmFjdG9yIHRoYXQgd2FzIHNpbWlsYXIgdG8gbG9jYWwgYWR1bHRz4oCZIOKAnGJvZHktbGlrZeKAnSBmYWN0b3IuLi4KY29uZ19kZl9jaGlsZHJlbiAlPiUgCiAgZmlsdGVyKGdyZXBsKCJib2R5IiwgdG9sb3dlcihmYWN0b3JfYmhtX0EpKSwgCiAgICAgICAgIGdyZXBsKCJib2R5IiwgdG9sb3dlcihmYWN0b3JfYmhtX0IpKSkKCiMgIi4uLmFuZCBub3Qgc2ltaWxhciB0byB0aGVpciDigJxtaW5kLWxpa2XigJ0gZmFjdG9yLCAuLi4KY29uZ19kZl9jaGlsZHJlbiAlPiUgCiAgZmlsdGVyKGdyZXBsKCJib2R5IiwgdG9sb3dlcihmYWN0b3JfYmhtX0EpKSwgCiAgICAgICAgIGdyZXBsKCJtaW5kIiwgdG9sb3dlcihmYWN0b3JfYmhtX0IpKSkKCiMgIi4uLiBhbmQgYSBmYWN0b3IgdGhhdCB3YXMgc2ltaWxhciB0byBsb2NhbCBhZHVsdHPigJkg4oCcbWluZC1saWtl4oCdIGZhY3Rvci4uLgpjb25nX2RmX2NoaWxkcmVuICU+JSAKICBmaWx0ZXIoZ3JlcGwoIm1pbmQiLCB0b2xvd2VyKGZhY3Rvcl9iaG1fQSkpLCAKICAgICAgICAgZ3JlcGwoIm1pbmQiLCB0b2xvd2VyKGZhY3Rvcl9iaG1fQikpKQoKIyAiLi4uYW5kIG5vdCBzaW1pbGFyIHRvIHRoZWlyIOKAnGJvZHktbGlrZeKAnSBmYWN0b3IuIgpjb25nX2RmX2NoaWxkcmVuICU+JSAKICBmaWx0ZXIoZ3JlcGwoIm1pbmQiLCB0b2xvd2VyKGZhY3Rvcl9iaG1fQSkpLCAKICAgICAgICAgZ3JlcGwoImJvZHkiLCB0b2xvd2VyKGZhY3Rvcl9iaG1fQikpKQpgYGAKCgojIEFsbCBzYW1wbGVzCgojIyBDb25ncnVlbmNlCgpgYGB7ciBjb25ncnVlbmNlIGFsbCBzYW1wbGVzfQpjb25nX2FsbCA8LSBmYS5jb25ncnVlbmNlKHggPSBsaXN0KGVmYV91c19hZHVsdHMkbG9hZGluZ3MsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZWZhX2doX2FkdWx0cyRsb2FkaW5ncywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlZmFfdGhfYWR1bHRzJGxvYWRpbmdzLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVmYV9jaF9hZHVsdHMkbG9hZGluZ3MsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZWZhX3Z0X2FkdWx0cyRsb2FkaW5ncywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlZmFfdXNfY2hpbGRyZW4kbG9hZGluZ3MsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZWZhX2doX2NoaWxkcmVuJGxvYWRpbmdzLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVmYV90aF9jaGlsZHJlbiRsb2FkaW5ncywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlZmFfY2hfY2hpbGRyZW4kbG9hZGluZ3MsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZWZhX3Z0X2NoaWxkcmVuJGxvYWRpbmdzKSwKICAgICAgICAgICAgICAgICAgICAgICAgICBkaWdpdHMgPSA1KSAlPiUKICAjIGdldF91cHBlcl90cmlfZnVuKCkgJT4lCiAgZGF0YS5mcmFtZSgpICU+JQogIHJvd25hbWVzX3RvX2NvbHVtbigiZmFjdG9yX0EiKSAlPiUKICBnYXRoZXIoZmFjdG9yX0IsIGNvbmcsIC1mYWN0b3JfQSkgJT4lCiAgbGVmdF9qb2luKGJpbmRfcm93cyhmYWN0b3JfbmFtZXNfYWR1bHRzICU+JSAKICAgICAgICAgICAgICAgICAgICAgICAgcmVuYW1lX2FsbChmdW5zKHBhc3RlKC4sICJBIiwgc2VwID0gIl8iKSkpLAogICAgICAgICAgICAgICAgICAgICAgZmFjdG9yX25hbWVzX2NoaWxkcmVuICU+JQogICAgICAgICAgICAgICAgICAgICAgICByZW5hbWVfYWxsKGZ1bnMocGFzdGUoLiwgIkEiLCBzZXAgPSAiXyIpKSkpKSAlPiUKICBsZWZ0X2pvaW4oYmluZF9yb3dzKGZhY3Rvcl9uYW1lc19hZHVsdHMgJT4lIAogICAgICAgICAgICAgICAgICAgICAgICByZW5hbWVfYWxsKGZ1bnMocGFzdGUoLiwgIkIiLCBzZXAgPSAiXyIpKSksCiAgICAgICAgICAgICAgICAgICAgICBmYWN0b3JfbmFtZXNfY2hpbGRyZW4gJT4lCiAgICAgICAgICAgICAgICAgICAgICAgIHJlbmFtZV9hbGwoZnVucyhwYXN0ZSguLCAiQiIsIHNlcCA9ICJfIikpKSkpCmBgYAoKYGBge3IgY29uZyBhbGwgcGFpcnMgZm9ybWF0fQojIG1ha2Ugd2lkZS1mb3JtIHZlcnNpb24gb2YgZGYKY29uZ19hbGxfdyA8LSBjb25nX2FsbCAlPiUKICBzZWxlY3QoZmFjdG9yX0EsIGZhY3Rvcl9CLCBjb25nKSAlPiUKICBzcHJlYWQoZmFjdG9yX0IsIGNvbmcpICU+JQogIGNvbHVtbl90b19yb3duYW1lcygiZmFjdG9yX0EiKQoKIyB0cmVhdCBzaW1pbGFyaXR5IG1hdHJpeCBhcyBpZiBpdCB3ZXJlIHRoZSBjb3JyZWxhdGlvbiBtYXRyaXggZm9yIGhjbHVzdApyb3cub3JkZXIgPC0gaGNsdXN0KGFzLmRpc3QoKDEgLSBjb25nX2FsbF93KS8yKSkkb3JkZXIKY29sLm9yZGVyIDwtIGhjbHVzdChhcy5kaXN0KHQoKDEgLSBjb25nX2FsbF93KS8yKSkpJG9yZGVyCgojIHJlLW9yZGVyIG1hdHJpeCBhY2NvcmluZyB0byBjbHVzdGVyaW5nCmNvbmdfYWxsX3cgPC0gY29uZ19hbGxfd1tyb3cub3JkZXIsIGNvbC5vcmRlcl0gCgojIGZvciBzb21lIHJlYXNvbiByZXNoYXBlMjo6bWVsdCgpIHdvcmtzIGJldHRlciB0aGFuIGN1cnJlbnQgdGlkeXZlcnNlIGZ1bmN0aW9ucy4uLgpjb25nX2FsbF9vcmRlcmVkIDwtIG1lbHQoYXMubWF0cml4KGNvbmdfYWxsX3cpKSAlPiUKICByZW5hbWUoZmFjdG9yX0Ffb3JkZXJlZCA9IFZhcjEsIAogICAgICAgICBmYWN0b3JfQl9vcmRlcmVkID0gVmFyMiwKICAgICAgICAgY29uZyA9IHZhbHVlKSAlPiUKICBtdXRhdGUoZmFjdG9yX0EgPSBhcy5jaGFyYWN0ZXIoZmFjdG9yX0Ffb3JkZXJlZCksCiAgICAgICAgIGZhY3Rvcl9CID0gYXMuY2hhcmFjdGVyKGZhY3Rvcl9CX29yZGVyZWQpKSAlPiUKICBmdWxsX2pvaW4oY29uZ19hbGwgJT4lIHNlbGVjdChjb250YWlucygiX0EiKSkgJT4lIGRpc3RpbmN0KCkpICU+JQogIGZ1bGxfam9pbihjb25nX2FsbCAlPiUgc2VsZWN0KGNvbnRhaW5zKCJfQiIpKSAlPiUgZGlzdGluY3QoKSkgJT4lCiAgbXV0YXRlKGxhYl9BID0gcGFzdGUocGFzdGUoY291bnRyeV9BLCBhZ2VfZ3JvdXBfQSksIGZhY3Rvcl9sYWJkZXNjcmlwdF9BLCBzZXAgPSAiLCAiKSwKICAgICAgICAgbGFiX0IgPSBwYXN0ZShwYXN0ZShjb3VudHJ5X0IsIGFnZV9ncm91cF9CKSwgZmFjdG9yX2xhYmRlc2NyaXB0X0IsIHNlcCA9ICIsICIpKQojIG11dGF0ZShzYW1wbGVfQSA9IHBhc3RlKGNvdW50cnlfQSwgYWdlX2dyb3VwX0EsIHNlcCA9ICIsICIpLAojICAgICAgICBzYW1wbGVfQiA9IHBhc3RlKGNvdW50cnlfQiwgYWdlX2dyb3VwX0IsIHNlcCA9ICIsICIpLAojICAgICAgICBsYWJfQSA9IHBhc3RlKHNhbXBsZV9BLCBmYWN0b3JfbGFiZGVzY3JpcHRfQSwgc2VwID0gIiAiKSwKIyAgICAgICAgbGFiX0IgPSBwYXN0ZShzYW1wbGVfQiwgZmFjdG9yX2xhYmRlc2NyaXB0X0IsIHNlcCA9ICIgIikpCmBgYAoKYGBge3IgY29uZyBhbGwgcGFpcnMgcGxvdCwgZmlnLndpZHRoID0gOS41LCBmaWcuYXNwID0gMC45fQojIEZJR1VSRSAyCmNvbmdfbG93ZXJfbGltIDwtIGlmZWxzZShtaW4oY29uZ19hbGxfb3JkZXJlZCRjb25nKSA+IC0wLjA1LCAtMC4wNSwgCiAgICAgICAgICAgICAgICAgICAgICAgICBtaW4oY29uZ19hbGxfb3JkZXJlZCRjb25nKSkKIyBjb25nX3Bsb3RfY29sb3JzIDwtIGMoInJlZDQiLCAiYmx1ZTQiLCAiZGFya29yY2hpZDQiLCAiYmxhY2siKQojIGNvbmdfcGxvdF9jb2xvcnMgPC0gYygiYmxhY2siLCAiYmxhY2siLCAiYmxhY2siLCAiYmxhY2siKQpjb25nX3Bsb3RfY29sb3JzIDwtIGMoInJlZDQiLCAicmVkNCIsICJyZWQ0IiwgImJsYWNrIikKCmNvbmdfYWxsX29yZGVyZWQgJT4lCiAgZ2dwbG90KGFlcyh4ID0gcmVvcmRlcihsYWJfQSwgYXMubnVtZXJpYyhmYWN0b3JfQV9vcmRlcmVkKSksCiAgICAgICAgICAgICB5ID0gcmVvcmRlcihsYWJfQiwgYXMubnVtZXJpYyhkZXNjKGZhY3Rvcl9CX29yZGVyZWQpKSksCiAgICAgICAgICAgICBmaWxsID0gY29uZykpICsgCiAgZ2VvbV90aWxlKGNvbG9yID0gImJsYWNrIiwgc2l6ZSA9IDAuMikgKwogIGdlb21fdGV4dChhZXMobGFiZWwgPSBmb3JtYXQocm91bmQoY29uZywgMiksIG5zbWFsbCA9IDIpLAogICAgICAgICAgICAgICAgY29sb3IgPSBjYXNlX3doZW4oY29uZyA+IDAuODUgfiAiYSIsIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uZyA+IDAuNzUgfiAiYiIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25nID4gMC42NSB+ICJjIiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRSVUUgfiAiZCIpKSwKICAgICAgICAgICAgc2hvdy5sZWdlbmQgPSBGKSArCiAgIyBib2R5LWxpa2UgZmFjdG9ycwogIGFubm90YXRlKCJyZWN0IiwgeG1pbiA9IDAuNSwgeG1heCA9IDEwLjUsIHltaW4gPSAyMS41LCB5bWF4ID0gMzEuNSwKICAgICAgICAgICBjb2xvciA9IGNvbmdfcGxvdF9jb2xvcnNbMV0sIHNpemUgPSAxLjUsIGFscGhhID0gMCkgKwogICMgbWluZC1saWtlIGZhY3RvcnMKICBhbm5vdGF0ZSgicmVjdCIsIHhtaW4gPSAxNy41LCB4bWF4ID0gMjcuNSwgeW1pbiA9IDQuNSwgeW1heCA9IDE0LjUsCiAgICAgICAgICAgY29sb3IgPSBjb25nX3Bsb3RfY29sb3JzWzJdLCBzaXplID0gMS41LCBhbHBoYSA9IDApICsKICAjIGhlYXJ0LWxpa2UgZmFjdG9ycwogIGFubm90YXRlKCJyZWN0IiwgeG1pbiA9IDEwLjUsIHhtYXggPSAxNy41LCB5bWluID0gMTQuNSwgeW1heCA9IDIxLjUsCiAgICAgICAgICAgY29sb3IgPSBjb25nX3Bsb3RfY29sb3JzWzNdLCBzaXplID0gMS41LCBhbHBoYSA9IDApICsKICAjIHNjYWxlX2ZpbGxfdmlyaWRpc19jKHRyYW5zID0gc2NhbGVzOjpleHBfdHJhbnMoYmFzZSA9IGV4cCgxKSksCiAgIyAgICAgICAgICAgICAgICAgICAgICBsaW1pdHMgPSBjKGNvbmdfbG93ZXJfbGltLCAxKSwgCiAgIyAgICAgICAgICAgICAgICAgICAgICBicmVha3MgPSBzZXEoY29uZ19sb3dlcl9saW0sIDEsIDAuMDUpLAogICMgICAgICAgICAgICAgICAgICAgICAgbGFiZWxzID0gYyhmb3JtYXQoc2VxKGNvbmdfbG93ZXJfbGltLCAwLjgsIDAuMDUpLCBuc21hbGwgPSAyKSwKICAjICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIjAuODUgPSBtb2RlcmF0ZSIsICIwLjkwIiwgCiAgIyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICIwLjk1ID0gaGlnaCIsICIxLjAwIiksCiAgIyAgICAgICAgICAgICAgICAgICAgICBvcHRpb24gPSAidmlyaWRpcyIsCiAgIyAgICAgICAgICAgICAgICAgICAgICBndWlkZSA9IGd1aWRlX2NvbG9yYmFyKGJhcmhlaWdodCA9IDQwKSkgKwogIHNjYWxlX2ZpbGxfZ3JhZGllbnRuKCN0cmFucyA9IHNjYWxlczo6ZXhwX3RyYW5zKGJhc2UgPSBleHAoMSkpLAogICAgbGltaXRzID0gYyhjb25nX2xvd2VyX2xpbSwgMSksIAogICAgYnJlYWtzID0gc2VxKGNvbmdfbG93ZXJfbGltLCAxLCAwLjA1KSwKICAgIGxhYmVscyA9IGMoZm9ybWF0KHNlcShjb25nX2xvd2VyX2xpbSwgMC44LCAwLjA1KSwgbnNtYWxsID0gMiksCiAgICAgICAgICAgICAgICIwLjg1ID0gbW9kZXJhdGUiLCAiMC45MCIsIAogICAgICAgICAgICAgICAiMC45NSA9IGhpZ2giLCAiMS4wMCIpLAogICAgY29sb3JzID0gdmlyaWRpc0xpdGU6OnZpcmlkaXMoNiksCiAgICB2YWx1ZXMgPSBjKDAsIDAuNjUsIDAuNzUsIDAuODUsIDAuOTUsIDEpLAogICAgZ3VpZGUgPSBndWlkZV9jb2xvcmJhcihiYXJoZWlnaHQgPSA0MCkpICsKICBzY2FsZV9jb2xvcl9tYW51YWwodmFsdWVzID0gYygiYmxhY2siLCAiYmxhY2siLCAiYmxhY2siLCAiZ3JheTYwIikpICsKICB0aGVtZV9taW5pbWFsKCkgKwogIHRoZW1lKAogICAgYXhpcy50ZXh0LnggPSBlbGVtZW50X3RleHQoCiAgICAgICMgYW5nbGUgPSA0NSwgaGp1c3QgPSAxLCB2anVzdCA9IDEsCiAgICAgIGFuZ2xlID0gOTAsIGhqdXN0ID0gMSwgdmp1c3QgPSAxLAogICAgICBzaXplID0gc2l6ZV9mdW4oY29uZ19hbGxfb3JkZXJlZCRsYWJfQSwgc2l6ZXMgPSBjKDIwLCAxNCkpLAogICAgICBjb2xvciA9IGNvbG9yX2Z1bihjb25nX2FsbF9vcmRlcmVkJGxhYl9BLCBjb2xvcl9saXN0ID0gY29uZ19wbG90X2NvbG9ycyksCiAgICAgIGZhY2UgID0gZmFjZV9mdW4oY29uZ19hbGxfb3JkZXJlZCRsYWJfQSkpLAogICAgYXhpcy50ZXh0LnkgPSBlbGVtZW50X3RleHQoCiAgICAgIHNpemUgPSByZXYoc2l6ZV9mdW4oY29uZ19hbGxfb3JkZXJlZCRsYWJfQSwgc2l6ZXMgPSBjKDIwLCAxNCkpKSwKICAgICAgY29sb3IgPSByZXYoY29sb3JfZnVuKGNvbmdfYWxsX29yZGVyZWQkbGFiX0EsIGNvbG9yX2xpc3QgPSBjb25nX3Bsb3RfY29sb3JzKSksCiAgICAgIGZhY2UgID0gcmV2KGZhY2VfZnVuKGNvbmdfYWxsX29yZGVyZWQkbGFiX0EpKSksCiAgICBsZWdlbmQudGl0bGUgPSBlbGVtZW50X3RleHQoZmFjZSA9ICJib2xkIiwgc2l6ZSA9IDIwKSwKICAgICMgYXhpcy50aWNrcyA9IGVsZW1lbnRfbGluZShzaXplID0gMC41KSwKICAgIGF4aXMudGlja3MueCA9IGVsZW1lbnRfbGluZSgKICAgICAgc2l6ZSA9IHNpemVfZnVuKGNvbmdfYWxsX29yZGVyZWQkbGFiX0EsIHNpemVzID0gYygxLjUsIDAuNSkpLAogICAgICBjb2xvciA9IGNvbG9yX2Z1bihjb25nX2FsbF9vcmRlcmVkJGxhYl9BLCBjb2xvcl9saXN0ID0gY29uZ19wbG90X2NvbG9ycykpLAogICAgYXhpcy50aWNrcy55ID0gZWxlbWVudF9saW5lKAogICAgICBzaXplID0gcmV2KHNpemVfZnVuKGNvbmdfYWxsX29yZGVyZWQkbGFiX0EsIHNpemVzID0gYygxLjUsIDAuNSkpKSwKICAgICAgY29sb3IgPSByZXYoY29sb3JfZnVuKGNvbmdfYWxsX29yZGVyZWQkbGFiX0EsIGNvbG9yX2xpc3QgPSBjb25nX3Bsb3RfY29sb3JzKSkpLAogICAgYXhpcy50aWNrcy5sZW5ndGggPSB1bml0KDAuMjUsICJjbSIpKSArCiAgbGFicyh4ID0gTlVMTCwgeSA9IE5VTEwsIGZpbGwgPSBleHByZXNzaW9uKGl0YWxpYyhyW2NdKSkpCmdnc2F2ZSgiLi4vZmlndXJlcy9maWcwMi5wbmciKQpgYGAKCiMjIERldmVsb3BtZW50YWwgY29tcGFyaXNvbnMKCmBgYHtyIGRldiBjb21wIGFsbCBzaXRlcywgZmlnLndpZHRoID0gNCwgZmlnLmFzcCA9IDEuMn0KIyBGSUdVUkUgUzUsIEZJR1VSRSBTNiwgRklHVVJFIFM3LCBGSUdVUkUgUzgsIEZJR1VSRSBTOQpwbG90X2dyaWQoaGVhdG1hcF9jb21wX2Z1bihlZmFfbGlzdCA9IGxpc3QoZWZhX3VzX2FkdWx0cywgZWZhX3VzX2NoaWxkcmVuKSwgcGFkZGluZyA9IEYpLAogICAgICAgICAgZGV2X2NvbmdfcGxvdF9mdW4oY29uZ19kZl9jaGlsZHJlbiwgd2hpY2hfY291bnRyeSA9ICJVUyIsIHBhZGRpbmcgPSBUKSwKICAgICAgICAgIG5jb2wgPSAxLCByZWxfaGVpZ2h0cyA9IGMoMiwgMS41KSwgbGFiZWxzID0gIkFVVE8iKQpnZ3NhdmUoIi4uL2ZpZ3VyZXMvZmlnUzA1LnBuZyIpCgpwbG90X2dyaWQoaGVhdG1hcF9jb21wX2Z1bihlZmFfbGlzdCA9IGxpc3QoZWZhX2doX2FkdWx0cywgZWZhX2doX2NoaWxkcmVuKSwgcGFkZGluZyA9IEYpLAogICAgICAgICAgZGV2X2NvbmdfcGxvdF9mdW4oY29uZ19kZl9jaGlsZHJlbiwgd2hpY2hfY291bnRyeSA9ICJHaGFuYSIsIHBhZGRpbmcgPSBUKSwKICAgICAgICAgIG5jb2wgPSAxLCByZWxfaGVpZ2h0cyA9IGMoMiwgMS41KSwgbGFiZWxzID0gIkFVVE8iKQpnZ3NhdmUoIi4uL2ZpZ3VyZXMvZmlnUzA2LnBuZyIpCgpwbG90X2dyaWQoaGVhdG1hcF9jb21wX2Z1bihlZmFfbGlzdCA9IGxpc3QoZWZhX3RoX2FkdWx0cywgZWZhX3RoX2NoaWxkcmVuKSwgcGFkZGluZyA9IEYpLAogICAgICAgICAgZGV2X2NvbmdfcGxvdF9mdW4oY29uZ19kZl9jaGlsZHJlbiwgd2hpY2hfY291bnRyeSA9ICJUaGFpbGFuZCIsIHBhZGRpbmcgPSBUKSwKICAgICAgICAgIG5jb2wgPSAxLCByZWxfaGVpZ2h0cyA9IGMoMiwgMS41KSwgbGFiZWxzID0gIkFVVE8iKQpnZ3NhdmUoIi4uL2ZpZ3VyZXMvZmlnUzA3LnBuZyIpCgpwbG90X2dyaWQoaGVhdG1hcF9jb21wX2Z1bihlZmFfbGlzdCA9IGxpc3QoZWZhX2NoX2FkdWx0cywgZWZhX2NoX2NoaWxkcmVuKSwgcGFkZGluZyA9IEYpLAogICAgICAgICAgZGV2X2NvbmdfcGxvdF9mdW4oY29uZ19kZl9jaGlsZHJlbiwgd2hpY2hfY291bnRyeSA9ICJDaGluYSIsIHBhZGRpbmcgPSBUKSwKICAgICAgICAgIG5jb2wgPSAxLCByZWxfaGVpZ2h0cyA9IGMoMiwgMS41KSwgbGFiZWxzID0gIkFVVE8iKQpnZ3NhdmUoIi4uL2ZpZ3VyZXMvZmlnUzA4LnBuZyIpCgpwbG90X2dyaWQoaGVhdG1hcF9jb21wX2Z1bihlZmFfbGlzdCA9IGxpc3QoZWZhX3Z0X2FkdWx0cywgZWZhX3Z0X2NoaWxkcmVuKSwgcGFkZGluZyA9IEYpLAogICAgICAgICAgZGV2X2NvbmdfcGxvdF9mdW4oY29uZ19kZl9jaGlsZHJlbiwgd2hpY2hfY291bnRyeSA9ICJWYW51YXR1IiwgcGFkZGluZyA9IFQpLAogICAgICAgICAgbmNvbCA9IDEsIHJlbF9oZWlnaHRzID0gYygyLCAxLjUpLCBsYWJlbHMgPSAiQVVUTyIpCmdnc2F2ZSgiLi4vZmlndXJlcy9maWdTMDkucG5nIikKYGBgCgpgYGB7ciBsb2FkaW5ncyBhbGwgc2FtcGxlcywgZmlnLndpZHRoID0gNi41LCBmaWcuYXNwID0gMC42fQojIEZJR1VSRSAxCmhlYXRtYXBfY29tcF9mdW4obGlzdChlZmFfdXNfYWR1bHRzLCBlZmFfZ2hfYWR1bHRzLCBlZmFfdGhfYWR1bHRzLCAKICAgICAgICAgICAgICAgICAgICAgIGVmYV9jaF9hZHVsdHMsIGVmYV92dF9hZHVsdHMsIAogICAgICAgICAgICAgICAgICAgICAgZWZhX3VzX2NoaWxkcmVuLCBlZmFfZ2hfY2hpbGRyZW4sIGVmYV90aF9jaGlsZHJlbiwgCiAgICAgICAgICAgICAgICAgICAgICBlZmFfY2hfY2hpbGRyZW4sIGVmYV92dF9jaGlsZHJlbiksIAogICAgICAgICAgICAgICAgIGZhY2V0X29yZGVyX3ZhcnMgPSBjKCJhZ2VfZ3JvdXAiLCAiY291bnRyeSIsICJmbnVtIiksCiAgICAgICAgICAgICAgICAgZmFjZXRfbGFiX3NwbGl0ID0gVCkgKwogIHRoZW1lKHBhbmVsLnNwYWNpbmcueCA9IHVuaXQoYyhyZXAoMC4yLCA0KSwgMSwgcmVwKDAuMjUsIDQpKSwgImxpbmUiKSwKICAgICAgICBsZWdlbmQucG9zaXRpb24gPSAiYm90dG9tIikgKwogIGd1aWRlcyhmaWxsID0gZ3VpZGVfY29sb3JiYXIoYmFyd2lkdGggPSAzMCwgYmFyaGVpZ2h0ID0gMC41LCAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRpdGxlID0gIkZhY3RvciBsb2FkaW5nIiwgdGl0bGUudmp1c3QgPSAxKSkKZ2dzYXZlKCIuLi9maWd1cmVzL2ZpZzAxLnBuZyIpCmBgYAoKYGBge3IgZG9taW5hbnQgZmFjdG9yLCBmaWcud2lkdGggPSA2LjUsIGZpZy5hc3AgPSAwLjYsIGluY2x1ZGUgPSBGfQojIGhpZ2hsaWdodGluZyBkb21pbmFudCBmYWN0b3IgKGlnbm9yaW5nIGNyb3NzLWxvYWRpbmdzID4gMC4wNSkKbG9hZGluZ3NfYWxsIDwtIGxvYWRpbmdzX2FkdWx0cyAlPiUKICBzZWxlY3QoLWNvbnRhaW5zKCJvcmQiKSkgJT4lCiAgZnVsbF9qb2luKGxvYWRpbmdzX2NoaWxkcmVuICU+JQogICAgICAgICAgICAgIHNlbGVjdCgtY29udGFpbnMoIm9yZCIpKSkKCmRvbV9mYWN0b3JzX2FsbCA8LSBsb2FkaW5nc19hbGwgJT4lCiAgZ3JvdXBfYnkoY291bnRyeSwgYWdlX2dyb3VwLCBjYXBhY2l0eSkgJT4lIAogIHRvcF9uKDEsIGFicyhsb2FkaW5nKSkgJT4lCiAgdW5ncm91cCgpICU+JQogIHNlbGVjdChjb3VudHJ5LCBhZ2VfZ3JvdXAsIGNhcGFjaXR5LCBmYWN0b3IsIGxvYWRpbmcpICU+JQogIHJlbmFtZShkb21fZmFjdG9yID0gZmFjdG9yLAogICAgICAgICBkb21fbG9hZGluZyA9IGxvYWRpbmcpCgpyZWN0X2RmIDwtIGxvYWRpbmdzX2FsbCAlPiUKICBmdWxsX2pvaW4oZG9tX2ZhY3RvcnNfYWxsKSAlPiUKICBtdXRhdGUoZm51bSA9IGdzdWIoIi4qX0YiLCAiRiIsIGZhY3RvcikpICU+JQogIHNlbGVjdCgtc3RhcnRzX3dpdGgoImZhY3RvciIpKSAlPiUKICBzcHJlYWQoZm51bSwgbG9hZGluZykgJT4lCiAgbXV0YXRlKGRpZmYxID0gYWJzKGRvbV9sb2FkaW5nKSAtIGFicyhGMSksCiAgICAgICAgIGRpZmYyID0gYWJzKGRvbV9sb2FkaW5nKSAtIGFicyhGMiksCiAgICAgICAgIGRpZmYzID0gYWJzKGRvbV9sb2FkaW5nKSAtIGFicyhGMyksCiAgICAgICAgIGRpZmY0ID0gYWJzKGRvbV9sb2FkaW5nKSAtIGFicyhGNCkpICU+JQogIHNlbGVjdCgtYyhkb21fbG9hZGluZywgc3RhcnRzX3dpdGgoIkYiKSkpICU+JQogIGdhdGhlcih3aGljaF9kaWZmLCBkaWZmLCBzdGFydHNfd2l0aCgiZGlmZiIpKSAlPiUKICBmaWx0ZXIoZGlmZiAhPSAwLCAhaXMubmEoZGlmZikpICU+JQogIGdyb3VwX2J5KGNvdW50cnksIGFnZV9ncm91cCwgY2FwYWNpdHkpICU+JQogIHRvcF9uKC0xLCBkaWZmKSAlPiUKICB1bmdyb3VwKCkgJT4lCiAgbXV0YXRlKGFueV9zbWFsbCA9IGRpZmYgPCAwLjA1KSAlPiUKICByZW5hbWUoZmFjdG9yID0gZG9tX2ZhY3RvcikgJT4lCiAgbGVmdF9qb2luKGZ1bGxfam9pbihmYWN0b3JfbmFtZXNfYWR1bHRzLCBmYWN0b3JfbmFtZXNfY2hpbGRyZW4pKQoKIyBhbmFsb2cgdG8gRklHVVJFIDEKdGVtcF9jYXBfb3JkZXIgPC0gZmEuc29ydChlZmFfdXNfYWR1bHRzKSRsb2FkaW5nc1tdICU+JSByb3duYW1lcygpICU+JSByZXYoKQoKZ2dwbG90KHJlY3RfZGYgJT4lCiAgICAgICAgIGZpbHRlcighaXMubmEoYW55X3NtYWxsKSkgJT4lCiAgICAgICAgIG11dGF0ZShjYXBhY2l0eSA9IGZhY3RvcihjYXBhY2l0eSwgbGV2ZWxzID0gdGVtcF9jYXBfb3JkZXIpKSwKICAgICAgIGFlcyh4ID0gZmFjdG9yX2xhYmRlc2NyaXB0LCAKICAgICAgICAgICB5ID0gY2FwYWNpdHksIAogICAgICAgICAgIGZpbGwgPSBhbnlfc21hbGwpKSArCiAgZmFjZXRfZ3JpZCh+IGludGVyYWN0aW9uKGNvdW50cnksIGFnZV9ncm91cCksIHNwYWNlID0gImZyZWUiLCBzY2FsZXMgPSAiZnJlZSIpICsKICBnZW9tX3RpbGUoKSArCiAgdGhlbWUocGFuZWwuc3BhY2luZy54ID0gdW5pdChjKHJlcCgwLjIsIDQpLCAxLCByZXAoMC4yNSwgNCkpLCAibGluZSIpLAogICAgICAgIGF4aXMudGV4dC54ID0gZWxlbWVudF90ZXh0KGFuZ2xlID0gNDUsIGhqdXN0ID0gMSwgdmp1c3QgPSAxKSwKICAgICAgICBsZWdlbmQucG9zaXRpb24gPSAiYm90dG9tIikKIyBnZ3NhdmUoIi4uL2ZpZ3VyZXMvZmlnMDF2Mi5wbmciKQpgYGAKCg==